Saya telah membaca banyak posting tentang memasukkan DataTable ke dalam tabel SQL, tetapi apakah ada cara mudah untuk menarik tabel SQL ke dalam .NET DataTable?
Saya telah membaca banyak posting tentang memasukkan DataTable ke dalam tabel SQL, tetapi apakah ada cara mudah untuk menarik tabel SQL ke dalam .NET DataTable?
Jawaban:
Ini, coba ini (ini hanya pseudocode)
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
lapangan harus diinisialisasi sebelum memanggilda.Fill(dataTable)
var table = new DataTable();
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{
da.Fill(table);
}
using
terlalu membenci jika Anda memahami padanannya yang lengkap.
Using
?? Itu seperti meremehkan With
atau Try-Catch
. Saya sebaliknya; Saya kecewa karena tidak didukung oleh kelas.
Banyak cara.
Gunakan ADO.Net dan gunakan isi pada adaptor data untuk mendapatkan 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);
}
Anda kemudian bisa mendapatkan tabel data dari kumpulan data.
Catatan dalam dataset jawaban yang diberi suara positif tidak digunakan, (Ini muncul setelah jawaban saya)
// create data adapter
SqlDataAdapter da = new SqlDataAdapter(cmd);
// this will query your database and return the result to your datatable
da.Fill(dataTable);
Mana yang lebih disukai daripada milikku.
Saya sangat menyarankan untuk melihat kerangka entitas meskipun ... menggunakan tabel data dan kumpulan data bukanlah ide yang bagus. Tidak ada jenis keamanan pada mereka yang berarti debugging hanya dapat dilakukan pada waktu proses. Dengan koleksi yang diketik dengan kuat (yang bisa Anda peroleh dari LINQ2SQL atau kerangka entitas), hidup Anda akan jauh lebih mudah.
Edit: Mungkin saya tidak jelas: Datatables = good, dataset = evil. Jika Anda menggunakan ADO.Net, maka Anda dapat menggunakan kedua teknologi ini (EF, linq2sql, dapper, nhibernate, orm of the month) karena umumnya berada di atas ado.net. Keuntungan yang Anda peroleh adalah bahwa Anda dapat memperbarui model Anda jauh lebih mudah karena skema Anda berubah asalkan Anda memiliki tingkat abstraksi yang tepat dengan memanfaatkan pembuatan kode.
Adaptor ado.net menggunakan penyedia yang mengekspos info jenis database, misalnya secara default menggunakan penyedia server sql, Anda juga dapat menyambungkan - misalnya - penyedia postgress devart dan masih mendapatkan akses ke info jenis yang kemudian akan memungkinkan Anda untuk menggunakan oracle pilihan Anda seperti di atas (hampir tanpa rasa sakit - ada beberapa kebiasaan) - saya yakin Microsoft juga menyediakan penyedia oracle. KESELURUHAN tujuan ini adalah untuk memisahkan diri dari implementasi database jika memungkinkan.
Versi independen vendor, hanya mengandalkan antarmuka ADO.NET; 2 cara:
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];
}
}
}
}
Saya melakukan beberapa pengujian kinerja, dan pendekatan kedua selalu mengungguli yang pertama.
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
terlihat lebih baik di mata, tetapi adaptor data berkinerja lebih baik (tidak membingungkan bahwa satu db mengungguli yang lain, semua kueri berbeda). Perbedaan antara keduanya bergantung pada kueri. Alasannya mungkin karena Load
memerlukan berbagai batasan untuk diperiksa baris demi baris dari dokumentasi saat menambahkan baris (metode aktif DataTable
) saat Fill
berada di DataAdapters yang dirancang hanya untuk itu - pembuatan Tabel Data dengan cepat.
DataTable.Load()
dengan .BeginLoadData()
dan .EndLoadData()
untuk mencapai kecepatan yang sama seperti dengan DataSet
.
Model Terpusat: Anda dapat menggunakannya dari mana saja!
Anda hanya perlu memanggil Format Di Bawah Dari fungsi Anda ke kelas ini
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);
Itu dia. itu metode yang sempurna.
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;
}
}