asp.net 如何将SQL Table数据读入C# DataTable

vqlkdk9b  于 2023-10-21  发布在  .NET
关注(0)|答案(6)|浏览(205)

我读过很多关于在SQL表中插入DataTable的文章,但是如何将SQL表拉入C#/.NET DataTable中呢?

cyvaqqii

cyvaqqii1#

在这里,给予这个机会(这只是一个伪代码)

  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. public class PullDataTest
  5. {
  6. // your data table
  7. private DataTable dataTable = new DataTable();
  8. // your method to pull data from database to datatable
  9. public void PullData()
  10. {
  11. string connString = @"your connection string here";
  12. string query = "select * from table";
  13. SqlConnection conn = new SqlConnection(connString);
  14. SqlCommand cmd = new SqlCommand(query, conn);
  15. conn.Open();
  16. // create data adapter
  17. SqlDataAdapter da = new SqlDataAdapter(cmd);
  18. // this will query your database and return the result to your datatable
  19. da.Fill(dataTable);
  20. conn.Close();
  21. da.Dispose();
  22. }
  23. }
展开查看全部
f2uvfpb9

f2uvfpb92#

  1. var table = new DataTable();
  2. using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
  3. {
  4. da.Fill(table);
  5. }
nafvub8i

nafvub8i3#

有很多种方法。使用ADO.NET并在数据适配器上使用fill来获取DataTable:

  1. using (SqlDataAdapter dataAdapter
  2. = new SqlDataAdapter ("SELECT blah FROM blahblah ", sqlConn))
  3. {
  4. // create the DataSet
  5. DataSet dataSet = new DataSet();
  6. // fill the DataSet using our DataAdapter
  7. dataAdapter.Fill (dataSet);
  8. }

然后,您可以从数据集中获取数据表。
在另一个答案中,不使用数据集。而是采用

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

比我的好。
我强烈建议您查看实体框架;使用数据表和数据集并不是一个好主意。它们没有类型安全,这意味着调试只能在运行时完成。有了强类型集合(你可以使用LINQ 2SQL或实体框架),你的生活会容易得多。
数据表=善,数据集=恶。如果你正在使用ADO.NET,那么你可以同时使用这两种技术(EF、linq 2sql、dapper、nhibernate、ORM),因为它们通常位于ADO.NET之上。这样做的好处是,如果您通过勒韦林生成获得了正确的抽象级别,那么随着模式的变化,您可以更容易地更新模型。
ADO.NET适配器使用提供程序来公开数据库的类型信息,例如默认情况下它使用SQL服务器提供程序,您也可以插入-例如- devart PostgreSQL提供程序并仍然可以访问类型信息,然后允许您如上所述使用您选择的ORM(几乎没有痛苦-有一些怪癖)-我相信Microsoft也提供了Oracle提供程序。这样做的全部目的是尽可能地从数据库实现中抽象出来。

展开查看全部
pjngdqdw

pjngdqdw4#

独立于供应商的版本,完全依赖于ADO.NET接口;两种方式:

  1. public DataTable Read1<T>(string query) where T : IDbConnection, new()
  2. {
  3. using (var conn = new T())
  4. {
  5. using (var cmd = conn.CreateCommand())
  6. {
  7. cmd.CommandText = query;
  8. cmd.Connection.ConnectionString = _connectionString;
  9. cmd.Connection.Open();
  10. var table = new DataTable();
  11. table.Load(cmd.ExecuteReader());
  12. return table;
  13. }
  14. }
  15. }
  16. public DataTable Read2<S, T>(string query) where S : IDbConnection, new()
  17. where T : IDbDataAdapter, IDisposable, new()
  18. {
  19. using (var conn = new S())
  20. {
  21. using (var da = new T())
  22. {
  23. using (da.SelectCommand = conn.CreateCommand())
  24. {
  25. da.SelectCommand.CommandText = query;
  26. da.SelectCommand.Connection.ConnectionString = _connectionString;
  27. DataSet ds = new DataSet(); //conn is opened by dataadapter
  28. da.Fill(ds);
  29. return ds.Tables[0];
  30. }
  31. }
  32. }
  33. }

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

  1. Stopwatch sw = Stopwatch.StartNew();
  2. DataTable dt = null;
  3. for (int i = 0; i < 100; i++)
  4. {
  5. dt = Read1<MySqlConnection>(query); // ~9800ms
  6. dt = Read2<MySqlConnection, MySqlDataAdapter>(query); // ~2300ms
  7. dt = Read1<SQLiteConnection>(query); // ~4000ms
  8. dt = Read2<SQLiteConnection, SQLiteDataAdapter>(query); // ~2000ms
  9. dt = Read1<SqlCeConnection>(query); // ~5700ms
  10. dt = Read2<SqlCeConnection, SqlCeDataAdapter>(query); // ~5700ms
  11. dt = Read1<SqlConnection>(query); // ~850ms
  12. dt = Read2<SqlConnection, SqlDataAdapter>(query); // ~600ms
  13. dt = Read1<VistaDBConnection>(query); // ~3900ms
  14. dt = Read2<VistaDBConnection, VistaDBDataAdapter>(query); // ~3700ms
  15. }
  16. sw.Stop();
  17. MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());

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

展开查看全部
gopyfrb3

gopyfrb35#

中心化模型:你可以在任何地方使用它!
你只需要从你的函数调用Below Format到这个类

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

就这样,完美的方法.

  1. public class DbConnectionHelper {
  2. public DataSet DBConnection(string TableName, SqlParameter[] p, string Query, CommandType cmdText) {
  3. string connString = @ "your connection string here";
  4. //Object Declaration
  5. DataSet ds = new DataSet();
  6. SqlConnection con = new SqlConnection();
  7. SqlCommand cmd = new SqlCommand();
  8. SqlDataAdapter sda = new SqlDataAdapter();
  9. try {
  10. //Get Connection string and Make Connection
  11. con.ConnectionString = connString; //Get the Connection String
  12. if (con.State == ConnectionState.Closed) {
  13. con.Open(); //Connection Open
  14. }
  15. if (cmdText == CommandType.StoredProcedure) //Type : Stored Procedure
  16. {
  17. cmd.CommandType = CommandType.StoredProcedure;
  18. cmd.CommandText = Query;
  19. if (p.Length > 0) // If Any parameter is there means, we need to add.
  20. {
  21. for (int i = 0; i < p.Length; i++) {
  22. cmd.Parameters.Add(p[i]);
  23. }
  24. }
  25. }
  26. if (cmdText == CommandType.Text) // Type : Text
  27. {
  28. cmd.CommandType = CommandType.Text;
  29. cmd.CommandText = Query;
  30. }
  31. if (cmdText == CommandType.TableDirect) //Type: Table Direct
  32. {
  33. cmd.CommandType = CommandType.Text;
  34. cmd.CommandText = Query;
  35. }
  36. cmd.Connection = con; //Get Connection in Command
  37. sda.SelectCommand = cmd; // Select Command From Command to SqlDataAdaptor
  38. sda.Fill(ds, TableName); // Execute Query and Get Result into DataSet
  39. con.Close(); //Connection Close
  40. } catch (Exception ex) {
  41. throw ex; //Here you need to handle Exception
  42. }
  43. return ds;
  44. }
  45. }
展开查看全部
fwzugrvs

fwzugrvs6#

如果使用最新版本的C#(版本8之后),代码会变得更简单,因为using语句不需要大括号。

  1. var table = new DataTable();
  2. using var da = new SqlDataAdapter(sql, connectionString);
  3. da.Fill(table);

相关问题