Tôi đã đọc rất nhiều bài đăng về cách chèn DataTable vào bảng SQL, nhưng có cách nào dễ dàng để kéo bảng SQL vào .NET DataTable không?
Tôi đã đọc rất nhiều bài đăng về cách chèn DataTable vào bảng SQL, nhưng có cách nào dễ dàng để kéo bảng SQL vào .NET DataTable không?
Câu trả lời:
Đây, hãy thử cho cái này (đây chỉ là một mã giả)
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
trường phải được khởi tạo trước khi gọida.Fill(dataTable)
var table = new DataTable();
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{
da.Fill(table);
}
using
nhiều như vậy nếu bạn hiểu hoàn toàn tương đương của nó.
Using
?? Điều đó giống như khinh With
hoặc Try-Catch
. Tôi là người ngược lại; Tôi thất vọng khi nó không được hỗ trợ bởi một lớp học.
Rất nhiều cách.
Sử dụng ADO.Net và sử dụng điền vào bộ điều hợp dữ liệu để nhận 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);
}
Sau đó, bạn có thể lấy bảng dữ liệu ra khỏi tập dữ liệu.
Lưu ý trong tập dữ liệu câu trả lời ủng hộ không được sử dụng, (Nó xuất hiện sau câu trả lời của tôi)
// create data adapter
SqlDataAdapter da = new SqlDataAdapter(cmd);
// this will query your database and return the result to your datatable
da.Fill(dataTable);
Cái nào tốt hơn cho tôi.
Tôi thực sự khuyên bạn nên xem xét khung thực thể mặc dù ... sử dụng các tệp dữ liệu và bộ dữ liệu không phải là một ý tưởng tuyệt vời. Không có loại an toàn trên chúng, có nghĩa là việc gỡ lỗi chỉ có thể được thực hiện trong thời gian chạy. Với các bộ sưu tập được đánh máy mạnh mẽ (mà bạn có thể nhận được từ việc sử dụng LINQ2SQL hoặc khung thực thể), cuộc sống của bạn sẽ dễ dàng hơn rất nhiều.
Chỉnh sửa: Có lẽ tôi không rõ ràng: Datatables = good, datasets = evil. Nếu bạn đang sử dụng ADO.Net thì bạn có thể sử dụng cả hai công nghệ này (EF, linq2sql, dapper, nhibernate, orm of the month) vì chúng thường nằm trên ado.net. Lợi thế bạn nhận được là bạn có thể cập nhật mô hình của mình dễ dàng hơn nhiều khi lược đồ của bạn thay đổi với điều kiện bạn có mức độ trừu tượng phù hợp bằng cách tận dụng khả năng tạo mã.
Bộ điều hợp ado.net sử dụng các nhà cung cấp hiển thị thông tin loại của cơ sở dữ liệu, ví dụ: theo mặc định, nó sử dụng nhà cung cấp máy chủ sql, bạn cũng có thể cắm vào - ví dụ - nhà cung cấp dịch vụ đăng xuất và vẫn có quyền truy cập vào thông tin loại mà sau đó sẽ cho phép bạn như trên sử dụng orm của bạn lựa chọn (hầu như không đau - có một vài điều kỳ quặc) - tôi tin rằng Microsoft cũng cung cấp một nhà cung cấp oracle. Mục đích TOÀN BỘ của việc này là trừu tượng hóa việc triển khai cơ sở dữ liệu nếu có thể.
Phiên bản độc lập với nhà cung cấp, chỉ dựa vào giao diện ADO.NET; 2 cách:
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];
}
}
}
}
Tôi đã thực hiện một số thử nghiệm hiệu suất và cách tiếp cận thứ hai luôn hoạt động tốt hơn cách tiếp cận đầu tiên.
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
trông đẹp mắt hơn, nhưng bộ điều hợp dữ liệu hoạt động tốt hơn (đừng nhầm lẫn rằng một db hoạt động tốt hơn cái kia, các truy vấn đều khác nhau). Tuy nhiên, sự khác biệt giữa hai tùy thuộc vào truy vấn. Lý do có thể là Load
yêu cầu các ràng buộc khác nhau phải được kiểm tra từng hàng từ tài liệu khi thêm các hàng (một phương pháp bật DataTable
) trong khi Fill
trên DataAdapters được thiết kế chỉ cho điều đó - tạo nhanh DataTables.
DataTable.Load()
với .BeginLoadData()
và .EndLoadData()
để đạt được cùng tốc độ với DataSet
.
Mô hình tập trung: Bạn có thể sử dụng nó từ bất kỳ đâu!
Bạn chỉ cần gọi định dạng dưới đây Từ hàm của bạn đến lớp này
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);
Đó là nó. đó là phương pháp hoàn hảo.
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;
}
}