将 SQL 表读入 C# DataTable

     2023-02-22     17

关键词:

【中文标题】将 SQL 表读入 C# DataTable【英文标题】:Read SQL Table into C# DataTable 【发布时间】:2011-08-29 17:24:16 【问题描述】:

我已经阅读了很多关于将 DataTable 插入 SQL 表的帖子,但是有没有一种简单的方法可以将 SQL 表拉入 .NET DataTable 中?

【问题讨论】:

嗯...在 DataAdapter 上使用 Fill 方法? msdn.microsoft.com/en-us/library/… 【参考方案1】:

来,试一试(这只是一个伪代码)

using System;
using System.Data;
using System.Data.SqlClient;


public class PullDataTest

    // your data table
    private DataTable dataTable = new DataTable();

    public PullDataTest()
    
    

    // your method to pull data from database to datatable   
    public void PullData()
    
        string connString = @"your connection string here";
        string query = "select * from table";

        SqlConnection conn = new SqlConnection(connString);        
        SqlCommand cmd = new SqlCommand(query, conn);
        conn.Open();

        // create data adapter
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        // this will query your database and return the result to your datatable
        da.Fill(dataTable);
        conn.Close();
        da.Dispose();
    

【讨论】:

datatable字段必须在调用da.Fill(dataTable)之前初始化 @yonan2236 在数据表旁边有来自 t sql 的输出参数怎么样?如何获得输出参数?可能吗?样品? 这段代码容易出错,不建议这样使用可用资源。请参阅@Tim Rogers 答案以获得干净的解决方案。 除此之外,看看 LINQ(如果还没有的话),因为它真的可以在这里发挥一些神奇的作用:-) 虽然这段代码有效,但它没有利用try/catchusing()来处理错误。【参考方案2】:
var table = new DataTable();    
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
      
    da.Fill(table);

【讨论】:

@Xan-KunClark-Davis:如果抛出异常,接受的答案中的代码会泄漏资源。如果您完全理解 using 的等价物,您可能不会那么鄙视它。 @Xan-KunClark-Davis 你为什么要鄙视Using??这就像鄙视WithTry-Catch。我是相反的;当一个类不支持它时,我很失望。【参考方案3】:

方法很多。

使用 ADO.Net 并在数据适配器上使用填充来获取 DataTable:

using (SqlDataAdapter dataAdapter
    = new SqlDataAdapter ("SELECT blah FROM blahblah ", sqlConn))

    // create the DataSet 
    DataSet dataSet = new DataSet(); 
    // fill the DataSet using our DataAdapter 
    dataAdapter.Fill (dataSet);

然后您可以从数据集中获取数据表。

未使用赞成的答案数据集中的注释,(它出现在我的答案之后) 会的

// create data adapter
SqlDataAdapter da = new SqlDataAdapter(cmd);
// this will query your database and return the result to your datatable
da.Fill(dataTable);

哪个比我的更可取。

我强烈建议您查看实体框架……但使用数据表和数据集并不是一个好主意。它们没有类型安全性,这意味着只能在运行时进行调试。使用强类型集合(可以通过使用 LINQ2SQL 或实体框架获得),您的生活会轻松很多。

编辑:也许我不清楚:数据表 = 好,数据集 = 邪恶。如果您使用的是 ADO.Net,那么您可以同时使用这两种技术(EF、linq2sql、dapper、nhibernate 和 orm of the month),因为它们通常位于 ado.net 之上。您获得的优势是,只要您通过利用代码生成具有正确的抽象级别,就可以在架构更改时更轻松地更新模型。

ado.net 适配器使用暴露数据库类型信息的提供程序,例如默认情况下它使用 sql server 提供程序,您也可以插入 - 例如 - devart postgress 提供程序并仍然可以访问类型信息然后,这将允许您如上所述使用您选择的 orm(几乎无痛 - 有一些怪癖) - 我相信微软也提供了一个 oracle 提供程序。这样做的全部目的是尽可能从数据库实现中抽象出来。

【讨论】:

类型化数据集具有类型安全性和强类型化集合,就像 EF 一样。但这些仅适用于您的应用程序与数据库紧密耦合的情况。如果您正在编写一个必须与许多不同数据库一起使用的工具,那么类型安全是一个无望的愿望。 .net 中的类型化数据集是 xml 疯狂和灾难的可怕创造。我从来没有在一个愿意接受为微软类型的数据集维护所有这些开销的地方工作过。我认为这些天甚至连微软都认为它不明智。至于具有多个数据库的类型安全,您当然可以得到它 - 关键是您尽快将其转换为类型化集合并传递它,以便将类型问题限制在特定位置。 Orms 将对此有所帮助,并与多个数据库完美配合。如果您不喜欢 EF,请使用更轻的东西,例如 dapper。 你不明白我的意思。如果您正在编写一个不知道要连接到哪种数据库的通用工具,那么类型安全就是一个无望的愿望。 Sql 已给出。此外,如果您不知道什么样的数据库,那为什么它甚至必须是数据库?这种通用工具的应用是什么?如果您需要连接到完全不同的数据库,您将在存储库模式后面将其抽象出来,然后在其中您将需要不同的专用数据库适配器,此时您将了解细节。事实是使用代码具有类型期望 -> 适配器中的类型断言。您的约束意味着您不了解数据库语言,因此无法查询。 假设您正在编写一个 SSMS 克隆?【参考方案4】:

厂商独立版本,完全依赖ADO.NET接口; 2种方式:

public DataTable Read1<T>(string query) where T : IDbConnection, new()

    using (var conn = new T())
    
        using (var cmd = conn.CreateCommand())
        
            cmd.CommandText = query;
            cmd.Connection.ConnectionString = _connectionString;
            cmd.Connection.Open();
            var table = new DataTable();
            table.Load(cmd.ExecuteReader());
            return table;
        
    


public DataTable Read2<S, T>(string query) where S : IDbConnection, new() 
                                           where T : IDbDataAdapter, IDisposable, new()

    using (var conn = new S())
    
        using (var da = new T())
        
            using (da.SelectCommand = conn.CreateCommand())
            
                da.SelectCommand.CommandText = query;
                da.SelectCommand.Connection.ConnectionString = _connectionString;
                DataSet ds = new DataSet(); //conn is opened by dataadapter
                da.Fill(ds);
                return ds.Tables[0];
            
        
    

我做了一些性能测试,第二种方法总是优于第一种。

Stopwatch sw = Stopwatch.StartNew();
DataTable dt = null;
for (int i = 0; i < 100; i++)

    dt = Read1<MySqlConnection>(query); // ~9800ms
    dt = Read2<MySqlConnection, MySqlDataAdapter>(query); // ~2300ms

    dt = Read1<SQLiteConnection>(query); // ~4000ms
    dt = Read2<SQLiteConnection, SQLiteDataAdapter>(query); // ~2000ms

    dt = Read1<SqlCeConnection>(query); // ~5700ms
    dt = Read2<SqlCeConnection, SqlCeDataAdapter>(query); // ~5700ms

    dt = Read1<SqlConnection>(query); // ~850ms
    dt = Read2<SqlConnection, SqlDataAdapter>(query); // ~600ms

    dt = Read1<VistaDBConnection>(query); // ~3900ms
    dt = Read2<VistaDBConnection, VistaDBDataAdapter>(query); // ~3700ms

sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());

Read1 看起来更好,但数据适配器性能更好(不要混淆一个数据库优于另一个,查询都是不同的)。两者之间的差异取决于查询。原因可能是Load 需要在添加行时逐行检查各种约束from the documentation(它是DataTable 上的一种方法),而Fill 位于专门为此而设计的DataAdapters 上——快速创建DataTables .

【讨论】:

您需要用.BeginLoadData().EndLoadData() 包围DataTable.Load() 以达到与DataSet 相同的速度。【参考方案5】:

中心化模型:您可以在任何地方使用它!

你只需要从你的函数调用下面的格式到这个类

DataSet ds = new DataSet();
SqlParameter[] p = new SqlParameter[1];
string Query = "Describe Query Information/either sp, text or TableDirect";
DbConnectionHelper dbh = new DbConnectionHelper ();
ds = dbh. DBConnection("Here you use your Table Name", p , string Query, CommandType.StoredProcedure);

就是这样。这是完美的方法。

public class DbConnectionHelper 
   public DataSet DBConnection(string TableName, SqlParameter[] p, string Query, CommandType cmdText) 
    string connString = @ "your connection string here";
    //Object Declaration
    DataSet ds = new DataSet();
    SqlConnection con = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    SqlDataAdapter sda = new SqlDataAdapter();
    try 
     //Get Connection string and Make Connection
     con.ConnectionString = connString; //Get the Connection String
     if (con.State == ConnectionState.Closed) 
      con.Open(); //Connection Open
     
     if (cmdText == CommandType.StoredProcedure) //Type : Stored Procedure
     
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = Query;
      if (p.Length > 0) // If Any parameter is there means, we need to add.
      
       for (int i = 0; i < p.Length; i++) 
        cmd.Parameters.Add(p[i]);
       
      
     
     if (cmdText == CommandType.Text) // Type : Text
     
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = Query;
     
     if (cmdText == CommandType.TableDirect) //Type: Table Direct
     
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = Query;
     
     cmd.Connection = con; //Get Connection in Command
     sda.SelectCommand = cmd; // Select Command From Command to SqlDataAdaptor
     sda.Fill(ds, TableName); // Execute Query and Get Result into DataSet
     con.Close(); //Connection Close
     catch (Exception ex) 

     throw ex; //Here you need to handle Exception
    
    return ds;
   
  

【讨论】:

使用 SqlBulkCopy 将 DataTable 中的列映射到 SQL 表

】使用SqlBulkCopy将DataTable中的列映射到SQL表【英文标题】:MappingcolumnsinaDataTabletoaSQLtablewithSqlBulkCopy【发布时间】:2013-07-0209:41:28【问题描述】:我想知道在将数据添加到数据库之前如何将数据库表中的列映射到c#中的数据表。usin... 查看详情

从 C# Datatable 将数据插入 SQL Server 中的特定列

】从C#Datatable将数据插入SQLServer中的特定列【英文标题】:InsertdataintospecificcolumnsinSQLServerfromC#Datatable【发布时间】:2017-03-1407:01:57【问题描述】:假设我的SQLServer表看起来像Col1|Col2|Col3|Col4|Col5我的数据表看起来像ColX|ColY|ColZ如何... 查看详情

从 C# 数据表创建 SQL Server 表

...据表创建SQLServer表【英文标题】:CreatingaSQLServertablefromaC#datatable【发布时间】:2010-11-2320:07:19【问题描述】:我有一个使用C#手动创建并加载数据的DataTable。在SQLServer2005中使用DataTable中的列和数据创建表的最有效方法是什么?【... 查看详情

如何更改 DataTable 列的顺序

】如何更改DataTable列的顺序【英文标题】:HowtochangeDataTablecolumnsorder【发布时间】:2011-04-1501:16:33【问题描述】:如何在c#中更改Datatable列的顺序。例子:我创建的sql表类型顺序是Qty,Unit,Id但在程序DataTable中顺序是Id,Qty,Unit。在代... 查看详情

参考 Datatable C# 更新 SQL 表的最佳方法

】参考DatatableC#更新SQL表的最佳方法【英文标题】:BestwaytoupdateSQLTablewithreferencetoaDatatableC#【发布时间】:2013-06-0707:04:15【问题描述】:我有一个包含Id列的数据表。Id列与我的表ID列匹配。我需要使用这个id为我的sql表设置一个值... 查看详情

如何根据数据表生成脚本? (将 DataTable 转换为 SQL 查询)

】如何根据数据表生成脚本?(将DataTable转换为SQL查询)【英文标题】:Howtogenerateascriptbasedonadatatable?(ConvertDataTabletoSQLQuery)【发布时间】:2019-10-2704:06:42【问题描述】:我想知道是否有任何方法可以创建基于C#数据表的SQL查询?... 查看详情

c#如何将多个单行多列的datatable合并成一个单行多列的datatable,表中内容是string..

...这种情况需要自己定义一个函数。我可以举个例子Dt1=MergeDataTable(Dt1,Dt2,"ID");下面是函数定义:...参考技术A合并datatable,手动创建datatable,然后将数据合并到第一个的指定的行和列中,这个我做过,合并三个table 参考技术B... 查看详情

c#将datatable一行放入另一个datatable中

http://blog.csdn.net/huyu107/article/details/53509171  概述从一个DataTable中取一行放到另一个DataTable里报错:该行已经属于另一个表。第一种方法:DataTabledt=newDataTable();dt=ds.Tables["All"].Clone();//克隆All的结构传递给dtDataRow[]dr= 查看详情

c#操作sql查询出的临时表,详细如下:

...Adapterda=newSqlDataAdapter(sql,conn);da.Fill(dt);//dt是定义好的一个DataTable这个DataTable作为dataGridVie的数据源,显示在窗体界面上。现在我还在取用查询出来的dt这个表中的数据,但是不想一个个单元格去遍历这个表,有没有办法用C#操作#tm... 查看详情

从 SQL Server 检索列名和类型到 DataTable C#

】从SQLServer检索列名和类型到DataTableC#【英文标题】:RetrievecolumnnamesandtypesfromSQLServertoDataTableC#【发布时间】:2015-12-2919:10:23【问题描述】:在SQLServer中基于现有表构建空DataTable的最佳方法是什么?我目前的尝试是这个,它只是... 查看详情

将 XML 读入 DataTable 时出现 FormatException

】将XML读入DataTable时出现FormatException【英文标题】:FormatExceptiononReadingXMLintoDataTable【发布时间】:2015-09-3009:42:44【问题描述】:我正在使用函数datatable.ReadXml(TextReader)将XML转换为Datatable,代码如下:DataTabletable=newDataTable("Document")... 查看详情

从 DataTable C# 添加到 OLE 类型表

】从DataTableC#添加到OLE类型表【英文标题】:AddingtoOLEtypetablefromDataTableC#【发布时间】:2017-01-3018:28:37【问题描述】:我正在尝试使用来自DataTable对象的集合DataRows将数据添加到Access表中,并在查看器中看到一组很好的数据(43)记... 查看详情

在 C# 中将 DataTable 转换为 SQL 的 CREATE TABLE + INSERT 脚本

】在C#中将DataTable转换为SQL的CREATETABLE+INSERT脚本【英文标题】:ConvertingaDataTabletoanCREATETABLE+INSERTscriptforSQLinC#【发布时间】:2011-07-1018:47:48【问题描述】:我需要从DataTable以及其中的DATA生成TSQL脚本。这不是一个单一的插入。除此... 查看详情

DataTable 从 C# 中的现有数据库结构自动填充

】DataTable从C#中的现有数据库结构自动填充【英文标题】:DataTableautofilledfromexistingdatabasestructureinC#【发布时间】:2022-01-1916:39:44【问题描述】:我有一个WinForm要求在文本框中插入电子邮件,单击搜索按钮后,sql查询将搜索表中... 查看详情

在 C# 中将数据加载到 DataTable 会出现“未知 SQL 类型 - 0”错误

】在C#中将数据加载到DataTable会出现“未知SQL类型-0”错误【英文标题】:LoadingdatatoDataTableinC#gives"UnknownSQLtype-0"error【发布时间】:2018-11-2814:28:38【问题描述】:我已经成功地使用以下代码将数据从ODBC连接加载到C#DataTable... 查看详情

c#中datatable行转列示例

...到C#中进行了。(表1) 表(2) 不多说了,下面开始在DataTable行转列示例: //Dat 查看详情

如何使用 C# 将多个 Excel 工作表导入 SQL 表?

】如何使用C#将多个Excel工作表导入SQL表?【英文标题】:HowtoimportmultipleExcelsheetsintoSQLtablesusingC#?【发布时间】:2019-11-0203:20:43【问题描述】:我需要通过单击C#按钮控件将多个Excel工作表导入多个SQL表(根据它们的表)。【问题... 查看详情

如何将旧的 mdb-database 导入 C# DataTable [重复]

】如何将旧的mdb-database导入C#DataTable[重复]【英文标题】:Howtoimportoldmdb-databaseintoC#DataTable[duplicate]【发布时间】:2021-09-1220:51:41【问题描述】:我有一个非常旧的mdb数据库。我想将数据库中的所有表加载到C#DataTable中。如果可能... 查看详情