Bir DataTable'ı bir SQL tablosuna eklemeyle ilgili birçok yazı okudum, ancak bir SQL tablosunu bir .NET DataTable'a çekmenin kolay bir yolu var mı?
Bir DataTable'ı bir SQL tablosuna eklemeyle ilgili birçok yazı okudum, ancak bir SQL tablosunu bir .NET DataTable'a çekmenin kolay bir yolu var mı?
Yanıtlar:
İşte, buna bir şans verin (bu sadece bir sözde koddur)
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
Alan çağırmadan önce ilklendirilmelidirda.Fill(dataTable)
var table = new DataTable();
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{
da.Fill(table);
}
using
Tam karşılığını anladıysanız, bu kadar küçümsemeyebilirsiniz .
Using
? Bu küçümsemek gibi With
ya da Try-Catch
. Ben tersiyim; Bir sınıf tarafından desteklenmediğinde hayal kırıklığına uğradım.
Bir çok yol.
Veri Tablosu almak için ADO.Net kullanın ve veri adaptörünü doldurun:
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);
}
Daha sonra veri tablosunu veri kümesinden alabilirsiniz.
Yükseltilen cevap veri setinde not kullanılmıyor, (Cevabımdan sonra göründü)
// create data adapter
SqlDataAdapter da = new SqlDataAdapter(cmd);
// this will query your database and return the result to your datatable
da.Fill(dataTable);
Benimkine tercih edilir.
Yine de varlık çerçevesine bakmanızı şiddetle tavsiye ederim ... veri tablolarını ve veri kümelerini kullanmak harika bir fikir değil. Üzerlerinde tür güvenliği yoktur, bu da hata ayıklamanın yalnızca çalışma zamanında yapılabileceği anlamına gelir. Güçlü yazılmış koleksiyonlarla (LINQ2SQL veya varlık çerçevesini kullanarak elde edebileceğiniz) hayatınız çok daha kolay olacak.
Düzenleme: Belki de net değildim: Veri tabloları = iyi, veri kümeleri = kötü. ADO.Net kullanıyorsanız, bu teknolojilerin her ikisini de (EF, linq2sql, dapper, nhibernate, orm of the month) genellikle ado.net'in en üstünde yer aldıkları için kullanabilirsiniz. Elde ettiğiniz avantaj, kod üretiminden yararlanarak doğru soyutlama seviyesine sahip olmanız koşuluyla şema değişiklikleriniz kadar modelinizi çok daha kolay güncelleyebilmenizdir.
Ado.net bağdaştırıcısı, veritabanının tür bilgisini ortaya çıkaran sağlayıcıları kullanır, örneğin varsayılan olarak bir sql sunucu sağlayıcısı kullanır, ayrıca örneğin devart postgress sağlayıcısını bağlayabilir ve daha sonra tür bilgisine erişmeye devam edebilirsiniz. Yukarıdaki gibi tercih ettiğiniz sistemi kullanmanıza izin verin (neredeyse acısız bir şekilde - birkaç tuhaflık var) - Microsoft'un da bir oracle sağlayıcısı sağladığına inanıyorum. Bunun TÜM amacı, mümkün olan yerlerde veritabanı uygulamasından soyutlamaktır.
Satıcıdan bağımsız sürüm, yalnızca ADO.NET arayüzlerine dayanır; 2 yol:
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];
}
}
}
}
Bazı performans testleri yaptım ve ikinci yaklaşım her zaman ilkinden daha iyi performans gösterdi.
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
gözlerde daha iyi görünüyor, ancak veri bağdaştırıcısı daha iyi performans gösteriyor (bir db'nin diğerinden daha iyi performans gösterdiğini karıştırmamak için, sorguların hepsi farklıydı). İkisi arasındaki fark, sorguya bağlıydı. Bunun nedeni, yalnızca bunun için tasarlanmış DataAdapters üzerindeyken satır eklerken (bir yöntemi açık ) dokümantasyondanLoad
çeşitli kısıtlamaların satır satır kontrol edilmesini gerektirmesi olabilir - DataTable'ların hızlı oluşturulması.DataTable
Fill
DataTable.Load()
ile .BeginLoadData()
ve .EndLoadData()
ile aynı hıza ulaşmak için DataSet
.
Ortalanmış Model: İstediğiniz yerden kullanabilirsiniz!
Bu sınıfa fonksiyonunuzdan Aşağıdaki Format çağrısı yapmanız yeterlidir.
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);
Bu kadar. mükemmel bir yöntem.
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;
}
}