[英]Best method of assigning NULL value to SqlParameter
我在C#類方法中使用了許多可選的輸入參數。 由於可選語法在未使用參數時會創建值“0”,因此我在方法中調用的SQL插入命令將逐漸插入。 但是,我需要命令在不使用參數時插入NULL值而不是0。 在不使用大量“if”語句的情況下實現此目的的最佳方法是什么?
以下是我所指的代碼。 是否有某種語法/命令允許我在SqlParameter聲明中指定NULL值?
public int batchInsert
(
int id,
int outcome,
int input = 0,
int add = 0,
int update = 0,
int delete = 0,
int errors = 0,
int warnings = 0
)
{
string sts;
if (outcome == 0)
{
sts = "S";
}
else if (outcome == 1)
{
sts = "W";
}
else
{
sts = "E";
}
SqlConnection sqlConn = new SqlConnection(this.connString);
SqlParameter runId = new SqlParameter("@runId", id);
SqlParameter endTime = new SqlParameter("@endTime", DateTime.Now);
SqlParameter status = new SqlParameter("@status", sts);
SqlParameter sqlInput = new SqlParameter("@itemsRead", input);
SqlParameter sqlAdd = new SqlParameter("@add", add);
SqlParameter sqlUpdate = new SqlParameter("@update", update);
SqlParameter sqlDelete = new SqlParameter("@delete", delete);
SqlParameter sqlError = new SqlParameter("@errors", errors);
SqlParameter sqlWarning = new SqlParameter("@warnings", warnings);
SqlParameter result = new SqlParameter("@outcome", results[outcome]);
SqlCommand sqlComm = new SqlCommand(insertCommand(), sqlConn);
是的,對於參數的值,只需使用DBNull.Value
。 例如:
SqlParameter sqlError =
new SqlParameter("@errors", errors == 0 ? (object)DBNull.Value : errors);
或寫一個小幫手:
private object ValueOrDBNullIfZero(int val) {
if ( val == 0 ) return DBNull.Value;
return val;
}
然后:
SqlParameter sqlError =
new SqlParameter("@errors", ValueOrDBNullIfZero(errors));
您需要檢查每個參數值並使用DBNull.Value
發送null。 我們有一個object
的擴展方法,使這更容易一些。
public static class ObjectExtensions
{
public static object OptionalParam<T>(this T value, T optionalValue = default(T))
{
return Equals(value,optionalValue) ? (object)DBNull.Value : value;
}
}
用法:
var sqlInput = new SqlParameter("@itemsRead", input.OptionalParam());
或者,如果要將非默認值,任意值視為默認值:
var sqlInput = new SqlParameter("@itemsRead", input.OptionalParam(-1));
這是為sql參數指定Null值的最簡單方法
command.Parameters.AddWithValue("@Comment", string.IsNullOrEmpty(comment) ? (object)DBNull.Value : comment);
考慮使用可用的Nullable(T)結構。 如果你擁有它們,它將只允許你設置值,並且你的SQL Command對象將識別可空值並相應地處理,而不會有麻煩。
使用小幫助器類,我們可以創建extenction方法將DBNull.Value添加到sqlparameter
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Data.Common;
namespace System.Data.SqlClient
{
public static class ExtensionMethods
{
public static SqlParameter AddParameter(this SqlParameterCollection parms, SqlParameter param)
{
if (param.Value == null)
{
param.Value = DBNull.Value;
return parms.Add(param);
}
else
{
return parms.Add(param);
}
}
}
用法
SqlParameter _FraudPackageID = new SqlParameter("@FraudPackageID", System.Data.SqlDbType.BigInt);
_FraudPackageID.Value = FraudPackageID;
_FraudPackageID.Direction = System.Data.ParameterDirection.Input;
_cmd.Parameters.AddParameter(_FraudPackageID);
如果您將null作為值分配或傳遞給sqlparameter,則此extenction方法將自動將其轉換為DBNull並重新分配給sqlparameter。
所以不必擔心我們動態傳遞的值。
語法短!
cmd.Parameters.Add(new SqlParameter{SqlValue=username ?? (object)DBNull.Value,ParameterName="usuario" } );
另一種在必要時設置null datetime參數的明確方法
if(obj.myDate == DateTime.MinValue)
{
aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = DBNull.Value;
}
else
{
aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = obj.myDate ;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.