4

这段代码非常适合我:

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它没有转换为字符串。

有没有办法完成我如此渴望的一个班轮?

4

5 回答 5

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);
于 2012-10-19T19:27:24.040 回答
4

创建一个函数或扩展方法来进行测试并根据需要进行分配。传入someStr和参数名称。

然后,您将能够在一行中设置参数。

于 2012-10-19T19:21:02.293 回答
4

您可以使用以下扩展方法(如果您愿意,也可以将其设为非扩展方法)

public static object ConvertNull(this object obj)
{
    return obj ?? DBNull.Value;
}

然后你可以这样做:

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr.ConvertNull()
于 2012-10-19T19:23:58.747 回答
2
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = ((object)someStr) ?? DBNull.Value; 
于 2012-10-19T19:34:23.977 回答
0

编写一个用于插入的存储过程,将参数的默认值设置为 null,将该存储过程用于插入命令,然后不要只将该参数传递给该 sproc..

于 2012-10-19T19:36:39.177 回答