Baca Tabel SQL ke dalam C # DataTable


Jawaban:


156

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();
    }
}

18
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);
}

7
@ 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.


1
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.

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());

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.


3
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.

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;
   }
  }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.