Saya memiliki kode berikut untuk menentukan parameter untuk kueri SQL. Saya mendapatkan pengecualian berikut saat saya menggunakan Code 1
; tapi berfungsi dengan baik saat saya gunakan Code 2
. Di Code 2
kami memiliki pemeriksaan untuk null dan karenanya satu if..else
blok.
Pengecualian:
Kueri berparameter '(@application_ex_id nvarchar (4000)) SELECT E.application_ex_id A' mengharapkan parameter '@application_ex_id', yang tidak disediakan.
Kode 1 :
command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
Kode 2 :
if (logSearch.LogID != null)
{
command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
}
else
{
command.Parameters.AddWithValue("@application_ex_id", DBNull.Value );
}
PERTANYAAN
Bisakah Anda menjelaskan mengapa tidak dapat mengambil NULL dari nilai logSearch.LogID di Kode 1 (tetapi dapat menerima DBNull)?
Apakah ada kode yang lebih baik untuk menangani ini?
Referensi :
- Tetapkan null ke SqlParameter
- Jenis data yang dikembalikan bervariasi berdasarkan data dalam tabel
- Kesalahan konversi dari database smallint ke C # nullable int
- Apa gunanya DBNull?
KODE
public Collection<Log> GetLogs(LogSearch logSearch)
{
Collection<Log> logs = new Collection<Log>();
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string commandText = @"SELECT *
FROM Application_Ex E
WHERE (E.application_ex_id = @application_ex_id OR @application_ex_id IS NULL)";
using (SqlCommand command = new SqlCommand(commandText, connection))
{
command.CommandType = System.Data.CommandType.Text;
//Parameter value setting
//command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
if (logSearch.LogID != null)
{
command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
}
else
{
command.Parameters.AddWithValue("@application_ex_id", DBNull.Value );
}
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.HasRows)
{
Collection<Object> entityList = new Collection<Object>();
entityList.Add(new Log());
ArrayList records = EntityDataMappingHelper.SelectRecords(entityList, reader);
for (int i = 0; i < records.Count; i++)
{
Log log = new Log();
Dictionary<string, object> currentRecord = (Dictionary<string, object>)records[i];
EntityDataMappingHelper.FillEntityFromRecord(log, currentRecord);
logs.Add(log);
}
}
//reader.Close();
}
}
}
return logs;
}
Jawaban:
Menjengkelkan, bukan.
Kamu bisa memakai:
command.Parameters.AddWithValue("@application_ex_id", ((object)logSearch.LogID) ?? DBNull.Value);
Atau sebagai alternatif, gunakan alat seperti "necis", yang akan melakukan semua itu untuk Anda.
Sebagai contoh:
var data = conn.Query<SomeType>(commandText, new { application_ex_id = logSearch.LogID }).ToList();
Saya tergoda untuk menambahkan metode yang rapi untuk mendapatkan
IDataReader
... belum terlalu yakin apakah itu ide yang bagus.sumber
Parameters
properti - apakah ituObject
?AddWithValueAndTreatNullTheRightDamnedWay(...)
null
dalam nilai parameter berarti "jangan kirim parameter ini". Saya curiga itu adalah keputusan yang buruk yang langsung saja terjadi. Faktanya, saya pikir sebagian besarDBNull
adalah keputusan yang pada dasarnya buruk yang terjadi: stackoverflow.com/a/9632050/23354Saya merasa lebih mudah untuk hanya menulis metode ekstensi untuk
SqlParameterCollection
yang menangani nilai null:public static SqlParameter AddWithNullableValue( this SqlParameterCollection collection, string parameterName, object value) { if(value == null) return collection.AddWithValue(parameterName, DBNull.Value); else return collection.AddWithValue(parameterName, value); }
Kemudian Anda sebut saja seperti:
sqlCommand.Parameters.AddWithNullableValue(key, value);
sumber
return collection.AddWithValue(parameterName, value ?? DBNull.Value);
Untuk berjaga-jaga jika Anda melakukan ini sambil memanggil prosedur tersimpan: Saya pikir lebih mudah dibaca jika Anda mendeklarasikan nilai default pada parameter dan menambahkannya hanya jika diperlukan.
SQL:
DECLARE PROCEDURE myprocedure @myparameter [int] = NULL AS BEGIN
C #:
int? myvalue = initMyValue(); if (myvalue.hasValue) cmd.Parameters.AddWithValue("myparamater", myvalue);
sumber
beberapa masalah, diizinkan dengan perlu mengatur SQLDbType
command.Parameters.Add("@Name", SqlDbType.NVarChar); command.Parameters.Value=DBNull.Value
di mana SqlDbType.NVarChar Anda ketik. Harus mengatur tipe SQL.
sumber