Kode berikut memberikan kesalahan - "Tidak ada konversi implisit dari DBnull ke int."
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
c#
dbnull
sqlparameter
Relativitas
sumber
sumber
==
di akhir baris ke-3?)Jawaban:
Masalahnya adalah bahwa
?:
operator tidak dapat menentukan jenis kembali karena Anda baik mengembalikanint
nilai atau nilai jenis DBNull, yang tidak kompatibel.Anda tentu saja dapat menggunakan instance dari AgeIndex menjadi tipe
object
yang akan memenuhi?:
persyaratan.Anda dapat menggunakan
??
operator penggabungan nol sebagai berikutBerikut ini kutipan dari dokumentasi MSDN untuk
?:
operator yang menjelaskan masalahnyasumber
AgeItem.AgeIndex as object
??
adalah solusi yang sama seperti jika Anda menggunakan terner biasa?:
- Anda masih perlu pemainAgeItem.AgeIndex
ke objek:planIndexParameter.Value = AgeItem.AgeIndex.HasValue ? (object)AgeItem.AgeIndex : DBNull.Value;
.?:
untuk melakukan perbandingan tipe-spesifik, maka casting seluruh ekspresi tidak akan berhasil. Anda harus menggunakan parameter non-dbnull seperti:someID == 0 ? DBNull.Value : (object)someID
Jawaban yang diterima menyarankan penggunaan gips. Namun, sebagian besar tipe SQL memiliki bidang Null khusus yang dapat digunakan untuk menghindari gips ini.
Misalnya,
SqlInt32.Null
"Merupakan DBNull yang dapat ditugaskan untuk instance kelas SqlInt32 ini."sumber
exampleNoCast
dideklarasikan objek, sehingga gips ke objek masih terjadi. Jika, seperti dalam kode OP, nilainya diberikan langsung ke SqlParameter.Value yang juga merupakan tipe objek, maka Anda masih mendapatkan pemeran.Anda perlu meneruskan
DBNull.Value
sebagai parameter nol dalam perintah SQLC, kecuali jika nilai standar ditentukan dalam prosedur tersimpan (jika Anda menggunakan prosedur tersimpan). Pendekatan terbaik adalah menetapkanDBNull.Value
untuk parameter yang hilang sebelum eksekusi permintaan, dan mengikuti setiap langkah akan melakukan pekerjaan.Kalau tidak ubah baris ini:
Sebagai berikut:
Karena Anda tidak dapat menggunakan jenis nilai yang berbeda dalam pernyataan bersyarat, karena DBNull dan int berbeda satu sama lain. Semoga ini bisa membantu.
sumber
Dengan satu baris kode, coba ini:
sumber
Coba ini:
sumber
Jika Anda menggunakan operator kondisional (ternary) kompiler memerlukan konversi implisit antara kedua jenis, jika tidak, Anda akan mendapatkan pengecualian.
Jadi Anda bisa memperbaikinya dengan melemparkan salah satu dari keduanya ke
System.Object
:Tetapi karena hasilnya tidak terlalu cantik dan Anda harus selalu mengingat casting ini, Anda bisa menggunakan metode ekstensi seperti itu:
Kemudian Anda dapat menggunakan kode ringkas ini:
sumber
Menurut pendapat saya, cara yang lebih baik adalah melakukan ini dengan properti Parameters dari kelas SqlCommand :
sumber
DBNull.Value
, ADO.NET mungkin agak kesulitan menebak SqlDbType apa yang mungkin ........ ini nyaman - tapi agak berbahaya ....Pertimbangkan untuk menggunakan struktur Nullable (T) yang tersedia. Ini akan membiarkan Anda hanya menetapkan nilai jika Anda memilikinya, dan objek Perintah SQL Anda akan mengenali nilai yang dapat dibatalkan dan memproses sesuai tanpa kerumitan di ujung Anda.
sumber
sumber
Coba ini:
Dengan kata lain, jika parameternya nol, jangan kirimkan ke proc Anda yang tersimpan (dengan asumsi, tentu saja, proc yang disimpan menerima parameter nol yang tersirat dalam pertanyaan Anda).
sumber
coba sesuatu seperti ini:
sumber
Saya memecahkan seperti itu.
sumber
sumber
Inilah yang saya lakukan ...
sumber
sumber
Metode ekstensi sederhana untuk ini adalah:
sumber
Saya menggunakan metode sederhana dengan cek nol.
sumber
Kode saya, bekerja dalam proyek nyata. Lihatlah operator ternary sebelum membuat sqlparameter ini adalah cara terbaik bagi saya, tanpa masalah:
sumber