Saya menggunakan SQLdatareader untuk membangun POCO dari database. Kode ini berfungsi kecuali ketika menemukan nilai nol dalam database. Misalnya, jika kolom FirstName dalam database berisi nilai nol, pengecualian dilemparkan.
employee.FirstName = sqlreader.GetString(indexFirstName);
Apa cara terbaik untuk menangani nilai nol dalam situasi ini?
c#
sqldatareader
DenaliHardtail
sumber
sumber
int colIndex = reader.GetOrdinal(fieldname);
dan dengan mudah membebaniSafeGetString
fungsi @ marc_s .Anda harus menggunakan
as
operator yang dikombinasikan dengan??
operator untuk nilai default. Tipe nilai perlu dibaca sebagai nullable dan diberi default.The
as
Operator menangani casting termasuk cek untuk DBNull.sumber
sqlreader[indexAge] as string ?? ""
, Anda akan selalu mendapatkannya""
. Pertimbangkan apakah Anda benar-benar menginginkannya(int?)sqlreader[indexAge] ?? defaultValue
, jadi jika SQL Anda berubah, Anda mendapatkan pengecualian dan bukan nilai yang buruk. @ Stevo3000: default (int) adalah 0, bukan -1. @ Chris: Pastikan Anda menggunakan yang Anda inginkan.Untuk string, Anda cukup melemparkan versi objek (diakses menggunakan operator array) dan berakhir dengan string nol untuk nulls:
atau
Untuk bilangan bulat, jika Anda menggunakan int nullable, Anda bisa menggunakan GetValueOrDefault ()
atau operator penggabungan nol (
??
).sumber
null
melainkan objek DBNull. Perbedaan antara dua pernyataan adalah yang pertama akan gagal jika itu bukan string, sedangkan yang kedua hanya akan mengembalikan nol jika bukan string.IsDbNull(int)
biasanya jauh lebih lambat daripada menggunakan metode sepertiGetSqlDateTime
dan kemudian membandingkannyaDBNull.Value
. Coba metode ekstensi ini untukSqlDataReader
.Gunakan mereka seperti ini:
sumber
Salah satu cara untuk melakukannya adalah memeriksa db nulls:
sumber
reader.IsDbNull(ColumnIndex)
berfungsi seperti banyak jawaban.Dan saya ingin menyebutkan jika Anda bekerja dengan nama kolom, hanya membandingkan jenis mungkin lebih nyaman.
sumber
Saya tidak berpikir ada nilai kolom NULL , ketika baris dikembalikan dalam datareader menggunakan nama kolom.
Jika Anda melakukannya
datareader["columnName"].ToString();
akan selalu memberi Anda nilai yang dapat berupa string kosong (String.Empty
jika Anda perlu membandingkan).Saya akan menggunakan yang berikut ini dan tidak akan terlalu khawatir:
sumber
Solusi ini tidak terlalu tergantung pada vendor dan berfungsi dengan SQL, OleDB, dan MySQL Reader:
sumber
Apa yang saya cenderung lakukan adalah mengganti nilai nol dalam pernyataan SELECT dengan sesuatu yang sesuai.
Di sini saya mengganti setiap null dengan string kosong. Kode Anda tidak akan melakukan kesalahan dalam hal itu.
sumber
Anda dapat menulis fungsi Generik untuk memeriksa Null dan memasukkan nilai default ketika NULL. Sebut ini saat membaca Datareader
Saat membaca penggunaan Datareader
sumber
Periksa
sqlreader.IsDBNull(indexFirstName)
sebelum Anda mencoba membacanya.sumber
Dengan memengaruhi jawaban getpsyched , saya membuat metode generik yang memeriksa nilai kolom berdasarkan namanya
Pemakaian:
sumber
bagaimana cara membuat metode pembantu
Untuk String
Pemakaian
Untuk Int
Pemakaian
Untuk kencan
Pemakaian
Catatan: untuk DateTime mendeklarasikan varialbe sebagai
sumber
Sebagai tambahan untuk jawaban oleh marc_s, Anda dapat menggunakan metode ekstensi yang lebih umum untuk mendapatkan nilai dari SqlDataReader:
sumber
Saya pikir Anda ingin menggunakan:
sumber
Kami menggunakan serangkaian metode statis untuk menarik semua nilai dari pembaca data kami. Jadi dalam hal ini kami akan menelepon
DBUtils.GetString(sqlreader(indexFirstName))
. Manfaat membuat metode statis / bersama adalah Anda tidak perlu melakukan pemeriksaan yang sama berulang-ulang ...Metode statis akan berisi kode untuk memeriksa nol (lihat jawaban lain di halaman ini).
sumber
Anda dapat menggunakan operator kondisional:
sumber
Ada banyak jawaban di sini dengan info berguna (dan beberapa info salah) tersebar, saya ingin menggabungkan semuanya.
Jawaban singkat untuk pertanyaan ini adalah untuk memeriksa DBNull - hampir semua orang setuju pada bagian ini :)
Daripada menggunakan metode pembantu untuk membaca nilai nullable per tipe data SQL metode generik memungkinkan kita untuk mengatasi ini dengan kode yang jauh lebih sedikit. Namun, Anda tidak dapat memiliki metode generik tunggal untuk tipe nilai nullable dan tipe referensi, ini dibahas panjang lebar dalam tipe Nullable sebagai parameter generik yang mungkin? dan batasan tipe generik C # untuk semua yang dapat dibatalkan .
Jadi, sebagai lanjutan dari jawaban dari @ZXX dan @getpsyched kita berakhir dengan ini, 2 metode untuk mendapatkan nilai nullable dan saya telah menambahkan 3 untuk nilai-nilai non-null (melengkapi set berdasarkan metode penamaan).
Saya biasanya menggunakan nama kolom, ubah ini jika Anda menggunakan indeks kolom. Berdasarkan nama-nama metode ini saya bisa tahu apakah saya mengharapkan data menjadi nullable atau tidak, cukup berguna ketika melihat kode yang ditulis sejak lama.
Kiat;
Terakhir, saat menguji metode di atas di semua tipe data SQL Server saya menemukan Anda tidak bisa langsung mendapatkan char [] dari SqlDataReader, jika Anda ingin char [] Anda harus mendapatkan string dan menggunakan ToCharArray ().
sumber
Saya menggunakan kode yang tercantum di bawah ini untuk menangani sel-sel nol dalam lembar Excel yang dibaca ke datatable.
sumber
sumber
dan / atau menggunakan operator ternary dengan penugasan:
ganti nilai default (bila nol) yang sesuai untuk setiap jenis properti ...
sumber
Metode ini tergantung pada indexFirstName yang seharusnya menjadi ordinal kolom berbasis nol.
Jika Anda tidak tahu indeks kolom tetapi tidak ingin memeriksa nama, Anda dapat menggunakan metode ekstensi ini sebagai gantinya:
Dan gunakan metode seperti ini:
sumber
Pertanyaan lama tapi mungkin seseorang masih butuh jawaban
sebenarnya saya mengatasi masalah ini seperti itu
Untuk int:
sama untuk string, kembalikan saja "" alih-alih 0 karena "" adalah string kosong
jadi kamu bisa menggunakannya seperti
dan
sangat fleksibel sehingga Anda dapat memasukkan kueri apa pun untuk membaca kolom apa pun dan itu tidak akan pernah kembali dengan kesalahan
sumber
Ini adalah kelas pembantu yang bisa digunakan orang lain jika mereka perlu berdasarkan jawaban @marc_s:
sumber
Konversi menangani DbNull secara masuk akal.
sumber
Anda bisa memeriksa ini juga
sumber
SqlDataReader