我在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);
答案 0 :(得分:35)
是的,对于参数的值,只需使用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));
答案 1 :(得分:2)
您需要检查每个参数值并使用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));
答案 2 :(得分:2)
这是为sql参数
分配Null值的最简单方法 command.Parameters.AddWithValue("@Comment", string.IsNullOrEmpty(comment) ? (object)DBNull.Value : comment);
答案 3 :(得分:1)
考虑使用可用的Nullable(T)结构。它只允许您设置值,如果您拥有它们,您的SQL Command对象将识别可空值并相应地处理,而不会有麻烦。
答案 4 :(得分:0)
使用小帮助器类我们可以创建扩展方法来将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并重新分配给sql参数。
因此无需担心我们动态传递的值。
答案 5 :(得分:0)
语法短!
cmd.Parameters.Add(new SqlParameter{SqlValue=username ?? (object)DBNull.Value,ParameterName="usuario" } );
答案 6 :(得分:0)
在必要时设置null datetime参数的另一种明确方法
http.request()