我读过很多关于在SQL表中插入DataTable的文章,但是如何将SQL表拉入C#/.NET DataTable中呢?
cyvaqqii1#
在这里,给予这个机会(这只是一个伪代码)
using System;using System.Data;using System.Data.SqlClient;public class PullDataTest{ // your data table private DataTable dataTable = new DataTable(); // 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(); }}
using System;
using System.Data;
using System.Data.SqlClient;
public class PullDataTest
{
// your data table
private DataTable dataTable = new DataTable();
// 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();
}
f2uvfpb92#
var table = new DataTable(); using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string")){ da.Fill(table);}
var table = new DataTable();
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
da.Fill(table);
nafvub8i3#
有很多种方法。使用ADO.NET并在数据适配器上使用fill来获取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);}
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 adapterSqlDataAdapter da = new SqlDataAdapter(cmd);// this will query your database and return the result to your datatableda.Fill(dataTable);
比我的好。我强烈建议您查看实体框架;使用数据表和数据集并不是一个好主意。它们没有类型安全,这意味着调试只能在运行时完成。有了强类型集合(你可以使用LINQ 2SQL或实体框架),你的生活会容易得多。数据表=善,数据集=恶。如果你正在使用ADO.NET,那么你可以同时使用这两种技术(EF、linq 2sql、dapper、nhibernate、ORM),因为它们通常位于ADO.NET之上。这样做的好处是,如果您通过勒韦林生成获得了正确的抽象级别,那么随着模式的变化,您可以更容易地更新模型。ADO.NET适配器使用提供程序来公开数据库的类型信息,例如默认情况下它使用SQL服务器提供程序,您也可以插入-例如- devart PostgreSQL提供程序并仍然可以访问类型信息,然后允许您如上所述使用您选择的ORM(几乎没有痛苦-有一些怪癖)-我相信Microsoft也提供了Oracle提供程序。这样做的全部目的是尽可能地从数据库实现中抽象出来。
pjngdqdw4#
独立于供应商的版本,完全依赖于ADO.NET接口;两种方式:
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]; } } }}
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();
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());
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上,DataAdapters正是为了快速创建DataTables而设计的。
Read1
Load
DataTable
Fill
gopyfrb35#
中心化模型:你可以在任何地方使用它!你只需要从你的函数调用Below Format到这个类
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);
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; } }
public class DbConnectionHelper {
public DataSet DBConnection(string TableName, SqlParameter[] p, string Query, CommandType cmdText) {
string connString = @ "your connection string here";
//Object Declaration
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;
if (cmdText == CommandType.TableDirect) //Type: Table Direct
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;
fwzugrvs6#
如果使用最新版本的C#(版本8之后),代码会变得更简单,因为using语句不需要大括号。
var table = new DataTable();using var da = new SqlDataAdapter(sql, connectionString);da.Fill(table);
using var da = new SqlDataAdapter(sql, connectionString);
6条答案
按热度按时间cyvaqqii1#
在这里,给予这个机会(这只是一个伪代码)
f2uvfpb92#
nafvub8i3#
有很多种方法。使用ADO.NET并在数据适配器上使用fill来获取DataTable:
然后,您可以从数据集中获取数据表。
在另一个答案中,不使用数据集。而是采用
比我的好。
我强烈建议您查看实体框架;使用数据表和数据集并不是一个好主意。它们没有类型安全,这意味着调试只能在运行时完成。有了强类型集合(你可以使用LINQ 2SQL或实体框架),你的生活会容易得多。
数据表=善,数据集=恶。如果你正在使用ADO.NET,那么你可以同时使用这两种技术(EF、linq 2sql、dapper、nhibernate、ORM),因为它们通常位于ADO.NET之上。这样做的好处是,如果您通过勒韦林生成获得了正确的抽象级别,那么随着模式的变化,您可以更容易地更新模型。
ADO.NET适配器使用提供程序来公开数据库的类型信息,例如默认情况下它使用SQL服务器提供程序,您也可以插入-例如- devart PostgreSQL提供程序并仍然可以访问类型信息,然后允许您如上所述使用您选择的ORM(几乎没有痛苦-有一些怪癖)-我相信Microsoft也提供了Oracle提供程序。这样做的全部目的是尽可能地从数据库实现中抽象出来。
pjngdqdw4#
独立于供应商的版本,完全依赖于ADO.NET接口;两种方式:
我做了一些性能测试,第二种方法总是优于第一种方法。
Read1
看起来更好,但数据适配器性能更好(不要混淆一个数据库优于另一个,查询都是不同的)。两者之间的区别取决于查询。原因可能是Load
在添加行时需要逐行检查各种约束from the documentation(这是DataTable
上的一个方法),而Fill
在DataAdapters上,DataAdapters正是为了快速创建DataTables而设计的。gopyfrb35#
中心化模型:你可以在任何地方使用它!
你只需要从你的函数调用Below Format到这个类
就这样,完美的方法.
fwzugrvs6#
如果使用最新版本的C#(版本8之后),代码会变得更简单,因为using语句不需要大括号。