Saya mendapat kesalahan di atas di aplikasi saya. Ini kode aslinya
public string GetCustomerNumber(Guid id)
{
string accountNumber =
(string)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidmyApp,
CommandType.StoredProcedure,
"GetCustomerNumber",
new SqlParameter("@id", id));
return accountNumber.ToString();
}
Saya ganti dengan
public string GetCustomerNumber(Guid id)
{
object accountNumber =
(object)DBSqlHelperFactory.ExecuteScalar(connectionStringSplendidCRM,
CommandType.StoredProcedure,
"spx_GetCustomerNumber",
new SqlParameter("@id", id));
if (accountNumber is System.DBNull)
{
return string.Empty;
}
else
{
return accountNumber.ToString();
}
}
Apakah ada cara yang lebih baik untuk mengatasi ini?
Jawaban:
Bentuk yang lebih pendek dapat digunakan:
EDIT: Belum memperhatikan ExecuteScalar. Itu benar-benar mengembalikan nol jika bidang tidak ada di hasil pengembalian. Jadi gunakan saja:
sumber
null
, jika baris yang dipilih adaNULL
di kolom itu, nilai yang dikembalikan adalahSystem.DBNull
.Dengan fungsi umum sederhana, Anda dapat membuat ini sangat mudah. Lakukan saja ini:
menggunakan fungsi:
sumber
ExecuteScalar akan kembali
Jika Anda tahu bahwa kolom pertama dari kumpulan hasil adalah string, maka untuk mencakup semua basis Anda perlu memeriksa null dan DBNull. Sesuatu seperti:
Kode di atas bergantung pada fakta bahwa DBNull.ToString mengembalikan string kosong.
Jika accountNumber adalah tipe lain (katakanlah integer), maka Anda harus lebih eksplisit:
Jika Anda tahu pasti bahwa kumpulan hasil Anda akan selalu memiliki setidaknya satu baris (misalnya, PILIH JUMLAH (*) ...), maka Anda dapat melewati pemeriksaan null.
Dalam kasus Anda, pesan kesalahan "Tidak dapat mentransmisikan objek jenis 'System.DBNull' untuk mengetik 'System.String`" menunjukkan bahwa kolom pertama dari kumpulan hasil Anda adalah nilai DBNUll. Ini dari cast ke string di baris pertama:
Marc_s berkomentar bahwa Anda tidak perlu memeriksa DBNull.Value salah.
sumber
Anda dapat menggunakan operator penggabungan null C #
sumber
Ada cara lain untuk mengatasi masalah ini. Bagaimana cara mengubah prosedur toko Anda? dengan menggunakan fungsi sql ISNULL (bidang Anda, ""), Anda dapat mengembalikan string kosong jika nilai yang dikembalikan null.
Kemudian Anda memiliki kode bersih sebagai versi aslinya.
sumber
Ini adalah metode umum yang saya gunakan untuk mengonversi objek apa pun yang mungkin menjadi DBNull. Nilai:
pemakaian:
singkat:
sumber
Saya kira Anda bisa melakukannya seperti ini:
Jika accountNumber adalah null itu berarti DBNull bukan string :)
sumber
return (accountNumber as string) ?? string.Empty;
, dengan accountNumber masih menjadiobject
. Jika Anda lebih suka menyimpan panggilan database Anda di jalurnya sendiri.String.Concat mengubah nilai DBNull dan null menjadi string kosong.
Namun, saya pikir Anda kehilangan sesuatu karena kode dapat dimengerti
sumber
return "" + accountNumber;
?Karena saya mendapat contoh yang tidak null dan jika saya dibandingkan dengan DBNULL saya mendapat pengecualian
Operator '==' cannot be applied to operands of type 'string' and 'system.dbnull'
, dan jika saya mencoba mengubah untuk membandingkan dengan NULL, itu tidak berhasil (karena DBNull adalah sebuah objek) bahkan itu adalah jawaban yang diterima.Saya memutuskan untuk hanya menggunakan kata kunci 'adalah'. Jadi hasilnya sangat mudah dibaca:
data = (item is DBNull) ? String.Empty : item
sumber
Saya menggunakan ekstensi untuk menghilangkan masalah ini untuk saya, yang mungkin Anda cari atau tidak.
Ini berjalan seperti ini:
catatan:
Ekstensi ini tidak mengembalikan
null
nilai! Jika itemnyanull
atau DBNull.Value , ia akan mengembalikan String kosong.Pemakaian:
sumber
Ubah seperti
sumber