是否有更优雅的形式为InsertCommand的NVarChar分配NULL?

时间:2012-10-19 19:19:14

标签: c# sql-server sql-insert sqldataadapter

这段代码非常适合我:

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。

有没有办法完成我想要的一个班轮?

5 个答案:

答案 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 ..