Saya melakukan hal mendasar dalam C # (MS VS2008) dan memiliki pertanyaan lebih lanjut tentang desain yang tepat daripada kode tertentu.
Saya membuat datatable dan kemudian mencoba memuat datatable dari datareader (yang didasarkan pada prosedur tersimpan SQL). Apa yang saya ingin tahu adalah apakah cara yang paling efisien untuk memuat dataTable adalah dengan melakukan pernyataan while, atau jika ada cara yang lebih baik.
Bagi saya satu-satunya kelemahan adalah saya harus mengetik secara manual di bidang yang ingin saya tambahkan dalam pernyataan while saya, tetapi saya juga tidak tahu cara mengotomatiskannya karena saya tidak ingin semua bidang dari SP cukup pilih satu , tapi itu bukan masalah besar di mata saya.
Saya telah menyertakan potongan kode di bawah totalitas dari apa yang saya lakukan, meskipun bagi saya kode itu sendiri tidak luar biasa atau bahkan apa yang saya tanyakan. Lebih dari bertanya-tanya tentang metodologi saya, saya akan mengganggu bantuan kode nanti jika strategi saya salah / tidak efisien.
var dtWriteoffUpload = new DataTable();
dtWriteoffUpload.Columns.Add("Unit");
dtWriteoffUpload.Columns.Add("Year");
dtWriteoffUpload.Columns.Add("Period");
dtWriteoffUpload.Columns.Add("Acct");
dtWriteoffUpload.Columns.Add("Descr");
dtWriteoffUpload.Columns.Add("DEFERRAL_TYPE");
dtWriteoffUpload.Columns.Add("NDC_Indicator");
dtWriteoffUpload.Columns.Add("Mgmt Cd");
dtWriteoffUpload.Columns.Add("Prod");
dtWriteoffUpload.Columns.Add("Node");
dtWriteoffUpload.Columns.Add("Curve_Family");
dtWriteoffUpload.Columns.Add("Sum Amount");
dtWriteoffUpload.Columns.Add("Base Curr");
dtWriteoffUpload.Columns.Add("Ledger");
cmd = util.SqlConn.CreateCommand();
cmd.CommandTimeout = 1000;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "proc_writeoff_data_details";
cmd.Parameters.Add("@whoAmI", SqlDbType.VarChar).Value =
WindowsIdentity.GetCurrent().Name;
cmd.Parameters.Add("@parmEndDateKey", SqlDbType.VarChar).Value = myMostRecentActualDate;
cmd.Parameters.Add("@countrykeys", SqlDbType.VarChar).Value = myCountryKey;
cmd.Parameters.Add("@nodekeys", SqlDbType.VarChar).Value = "1,2";
break;
dr = cmd.ExecuteReader();
while (dr.Read())
{
dtWriteoffUpload.Rows.Add(dr["country name"].ToString(), dr["country key"].ToString());
}
Jawaban:
Anda dapat memuat
DataTable
langsung dari pembaca data menggunakanLoad()
metode yang menerima fileIDataReader
.sumber
Silakan periksa kode di bawah ini. Secara otomatis itu akan diubah sebagai DataTable
sumber
dt.Load(reader)
juga tidak selalu berfungsi-saya akan mendapatkanObject reference not set to an instance of an object
kesalahan yang mengganggu itu , mungkin ketika saya tidak mendapatkan baris apa pun kembali. Sesuatu yang manual seperti ini sangat berguna. Aku mencoba dan harus menyingkirkan orang-orangcolumn.
garis didtSchema
foreach
lingkaran karena mengatakan itu adalah pemain ilegal untukbool
di(bool)drow["IsUnique"]
. Saya tidak membutuhkannya, mendapatkan nama kolom untuk mengisi yang baruDataTable
sudah cukup. Ini berhasil membantu saya mengatasids.Fill(adapter)
masalah di mana saya tidak dapat memuat meja besarSELECT * FROM MyTable
.if (!dr.IsDBNull(i))
sebagai hal berikutnya di dalamfor
lingkaran itu. Anda kemudian melakukandataRow
tugas Anda . Tapi kemudian Anda membutuhkanelse
itu, jika Anda menemukan null. Jika Anda melakukannya, Anda harus mencari tahu jenis kolom yang Anda tambahkan, dan menetapkan null yang sesuai (yaitu Anda dapat menetapkanString.Empty
jika itu jenisSystem.String
, tetapi Anda harus menetapkan0
apakah ituSystem.Int16
(bidang Boolean) atauSystem.Decimal
.Jika Anda mencoba memuat a
DataTable
, manfaatkan sebagaiSqlDataAdapter
gantinya:Anda bahkan tidak perlu menentukan kolom. Buat saja
DataTable
danFill
itu.Di sini,
cString
adalah string koneksi Anda dansql
merupakan perintah prosedur tersimpan.sumber
SqlDataReader
dan membacanya menggunakan loop melalui bidang.Seperti yang Sagi nyatakan dalam jawaban mereka DataTable.Load adalah solusi yang baik. Jika Anda mencoba memuat beberapa tabel dari satu pembaca, Anda tidak perlu memanggil DataReader.NextResult. Metode DataTable.Load juga memajukan pembaca ke set hasil berikutnya (jika ada).
sumber
Saya melihat ini juga, dan setelah membandingkan metode SqlDataAdapter.Fill dengan SqlDataReader.Load funcitons, saya telah menemukan bahwa metode SqlDataAdapter.Fill lebih dari dua kali lebih cepat dengan set hasil yang telah saya gunakan
Kode yang digunakan:
Hasil:
Untuk masalah kinerja, menggunakan metode SqlDataAdapter.Fill jauh lebih efisien. Jadi, kecuali jika Anda ingin menembak diri sendiri, gunakan itu. Ini bekerja lebih cepat untuk kumpulan data kecil dan besar.
sumber