[英]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.