这段代码非常适合我:
if (someStr == null)
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = DBNull.Value;
else
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr;
但我的直觉告诉我,可能有一个单行版本。类似的东西:
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr==null ? DBNull.Value : someStr ;
但是我上面发布的单行代码当然失败了,因为DBNull.Value
没有转换为String。
有没有办法完成我想要的一个班轮?
答案 0 :(得分:6)
您可以将someStr强制转换为对象
例如:
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr==null ? DBNull.Value : (object)someStr;
或者你可以像Oded和Servy那样建议并使用扩展方法。虽然它可以添加几行代码,但它可以避免重复代码。
正如Servy指出的那样,把它放在object
可能会导致混乱。出于这个原因,我会把它放在SqlParameter
public static void SetValue(this SqlParameter parameter, object value)
{
parameter.Value = value == null ? DBNull.Value : value;
}
然后像这样使用
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).SetValue(someStr);
答案 1 :(得分:4)
创建一个函数或扩展方法,用于执行测试并根据需要进行分配。传入someStr
和参数名称。
然后,您就可以将参数设置为一行。
答案 2 :(得分:4)
您可以使用以下扩展方法(或者如果您愿意,可以使其成为非扩展方法)
public static object ConvertNull(this object obj)
{
return obj ?? DBNull.Value;
}
然后你可以这样做:
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr.ConvertNull()
答案 3 :(得分:2)
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = ((object)someStr) ?? DBNull.Value;
答案 4 :(得分:0)
编写一个用于插入的存储过程,将参数的默认值设置为null,将该存储过程用于insert命令,然后不要只将该参数传递给该sproc ..