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?
using System;
using System.Data;
using System.Data.SqlClient;
publicclassPullDataTest
{
// your data tableprivate DataTable dataTable = new DataTable();
publicPullDataTest()
{
}
// your method to pull data from database to datatable publicvoidPullData()
{
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();
}
}
The datatablelapangan harus diinisialisasi sebelum memanggilda.Fill(dataTable)
Dabblernl
@ yonan2236 Bagaimana dengan memiliki parameter keluaran dari t sql di samping datatable? bagaimana cara mendapatkan parameter keluaran juga? Apa itu mungkin? Sampel?
Ahmad Ebrahimi
1
Kode ini rentan terhadap kesalahan dan tidak disarankan untuk menggunakan sumber daya yang tersedia dengan cara ini. Silakan lihat jawaban @Tim Rogers untuk solusi bersih.
Xan-Kun Clark-Davis
Selain itu, lihat LINQ (jika belum melakukannya) karena LINQ benar-benar dapat melakukan keajaiban di sini :-)
Xan-Kun Clark-Davis
78
var table = new DataTable();
using (var da = new SqlDataAdapter("SELECT * FROM mytable", "connection string"))
{
da.Fill(table);
}
@ Xan-KunClark-Davis: Kode dalam jawaban yang diterima membocorkan sumber daya jika pengecualian dilemparkan. Anda mungkin tidak usingterlalu membenci jika Anda memahami padanannya yang lengkap.
Ben Voigt
@ Xan-KunClark-Davis Mengapa Anda membenci Using?? Itu seperti meremehkan Withatau Try-Catch. Saya sebaliknya; Saya kecewa karena tidak didukung oleh kelas.
SteveCinq
12
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.
Dataset yang diketik memiliki keamanan tipe dan koleksi yang diketik dengan kuat, seperti EF. Tapi itu hanya untuk saat aplikasi Anda terhubung erat ke database. Jika Anda menulis alat yang harus bekerja dengan banyak database yang berbeda, keamanan tipe adalah keinginan yang sia-sia.
Ross Presser
1
Dataset yang diketik dalam .net adalah ciptaan xml yang mengerikan dan menyedihkan. Saya tidak pernah bekerja di tempat yang bersedia menerima biaya overhead untuk memelihara semua itu untuk set data yang diketik microsoft. Saya tidak berpikir bahkan Microsoft menyarankan itu masuk akal hari ini. Sedangkan untuk keamanan tipe dengan banyak database tentu saja Anda bisa mendapatkannya - intinya adalah Anda mengubahnya menjadi koleksi yang diketik secepatnya dan menyebarkannya sehingga Anda membatasi masalah tipe ke tempat tertentu. Orms akan membantu dengan itu dan bekerja dengan baik dengan banyak database. Jika Anda tidak suka EF gunakan sesuatu yang lebih ringan seperti necis.
John Nicholas
1
Anda tidak mengerti saya. Jika Anda menulis alat serba guna yang tidak tahu jenis database apa yang akan disambungkan, maka jenis keamanan adalah keinginan yang sia-sia.
Ross Presser
1
Sql diberikan. Selain itu, jika Anda tidak tahu database seperti apa, lalu mengapa harus database? Apa yang akan menjadi penerapan alat umum semacam itu? Jika Anda perlu terhubung ke database yang sangat berbeda secara radikal, Anda akan memisahkannya di belakang pola repositori dan kemudian di dalamnya Anda memerlukan adaptor database khusus yang berbeda dan pada saat itu Anda akan tahu tentang spesifikasinya. Faktanya adalah mengkonsumsi kode memiliki ekspektasi tipe -> pernyataan tipe dalam adaptor. Batasan Anda berarti Anda tidak tahu tentang bahasa database sehingga tidak dapat melakukan kueri.
John Nicholas
3
Misalkan Anda menulis klon SSMS?
Ross Presser
9
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.
Read1terlihat 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 Loadmemerlukan berbagai batasan untuk diperiksa baris demi baris dari dokumentasi saat menambahkan baris (metode aktif DataTable) saat Fillberada di DataAdapters yang dirancang hanya untuk itu - pembuatan Tabel Data dengan cepat.
Anda perlu mengelilingi DataTable.Load()dengan .BeginLoadData()dan .EndLoadData()untuk mencapai kecepatan yang sama seperti dengan DataSet.
Nikola Bogdanović
1
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.
publicclassDbConnectionHelper {
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 Stringif (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;
}
}
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(); } }
sumber
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); }
sumber
using
terlalu membenci jika Anda memahami padanannya yang lengkap.Using
?? Itu seperti meremehkanWith
atauTry-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.
sumber
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 karenaLoad
memerlukan berbagai batasan untuk diperiksa baris demi baris dari dokumentasi saat menambahkan baris (metode aktifDataTable
) saatFill
berada di DataAdapters yang dirancang hanya untuk itu - pembuatan Tabel Data dengan cepat.sumber
DataTable.Load()
dengan.BeginLoadData()
dan.EndLoadData()
untuk mencapai kecepatan yang sama seperti denganDataSet
.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; } }
sumber