Pertanyaan saya adalah bagaimana mendapatkan jumlah baris yang dikembalikan oleh kueri menggunakan SqlDataReader
C #. Saya telah melihat beberapa jawaban tentang ini tetapi tidak ada yang didefinisikan dengan jelas kecuali yang menyatakan untuk melakukan loop sementara dengan Read()
metode dan menambah penghitung.
Masalah saya adalah bahwa saya mencoba untuk mengisi array multi-dimensi dengan baris pertama menjadi nama tajuk kolom dan setiap baris setelah itu menjadi data baris.
Saya tahu bahwa saya bisa membuang barang-barang itu ke dalam kontrol Daftar dan tidak mengkhawatirkannya, tetapi untuk perbaikan pribadi saya dan saya juga ingin menarik data masuk dan keluar dari larik saat saya memilih dan menampilkannya dalam format yang berbeda.
Jadi saya pikir saya tidak bisa melakukan cara Read()
lalu kenaikan ++ karena itu berarti saya harus membuka Read()
dan kemudian membuka Read()
lagi untuk mendapatkan jumlah baris dan kemudian data kolom.
Hanya contoh kecil dari apa yang saya bicarakan:
int counter = 0;
while (sqlRead.Read())
{
//get rows
counter++
}
dan kemudian loop for dijalankan melalui kolom dan pop
something.Read();
int dbFields = sqlRead.FieldCount;
for (int i = 0; i < dbFields; i++)
{
// do stuff to array
}
sumber
RepeatableRead
tingkat isolasi tidak melakukan berbagai-penguncian sehingga masih memungkinkan catatan yang akan dimasukkan, Anda harus menggunakan tingkat isolasiSnapshot
atauSerializable
.Jika Anda tidak perlu mengambil semua baris dan ingin menghindari membuat kueri ganda, Anda mungkin dapat mencoba sesuatu seperti itu:
Anda mungkin harus menambahkan transaksi tidak yakin apakah menggunakan kembali perintah yang sama akan secara otomatis menambahkan transaksi di atasnya ...
sumber
sqlCon.Close();
? Saya pikir ituusing
harus dilakukan untuk Anda.Seperti yang disebutkan di atas, kumpulan data atau kumpulan data yang diketik mungkin merupakan struktur sementara yang baik yang dapat Anda gunakan untuk melakukan pemfilteran. SqlDataReader dimaksudkan untuk membaca data dengan sangat cepat. Saat Anda berada di while () loop, Anda masih terhubung ke DB dan menunggu Anda melakukan apa pun yang Anda lakukan untuk membaca / memproses hasil berikutnya sebelum melanjutkan. Dalam hal ini Anda mungkin mendapatkan kinerja yang lebih baik jika Anda menarik semua data, menutup koneksi ke DB dan memproses hasilnya "offline".
Orang-orang tampaknya membenci kumpulan data, jadi hal di atas dapat dilakukan dengan koleksi objek yang diketik dengan kuat juga.
sumber
Anda tidak bisa mendapatkan hitungan baris secara langsung dari pembaca data karena itulah yang dikenal sebagai kursor firehose - yang berarti bahwa data dibaca baris demi baris berdasarkan pembacaan yang dilakukan. Saya menyarankan agar tidak melakukan 2 pembacaan pada data karena ada potensi bahwa data telah berubah antara melakukan 2 pembacaan, dan dengan demikian Anda akan mendapatkan hasil yang berbeda.
Apa yang dapat Anda lakukan adalah membaca data ke dalam struktur sementara, dan menggunakannya sebagai pengganti pembacaan kedua. Alternatifnya, Anda harus mengubah mekanisme yang digunakan untuk mengambil data dan menggunakan sesuatu seperti DataTable.
sumber
untuk menyelesaikan jawaban Pit dan untuk kinerja yang lebih baik: dapatkan semua dalam satu kueri dan gunakan metode NextResult.
sumber
Saya juga menghadapi situasi ketika saya perlu mengembalikan hasil teratas tetapi juga ingin mendapatkan total baris yang cocok dengan kueri. Saya akhirnya mendapatkan solusi ini:
sumber