Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种更优雅的形式可以将NULL赋值给InsertCommand';那是女巫?_C#_Sql Server_Sql Insert_Sqldataadapter - Fatal编程技术网

C# 是否有一种更优雅的形式可以将NULL赋值给InsertCommand';那是女巫?

C# 是否有一种更优雅的形式可以将NULL赋值给InsertCommand';那是女巫?,c#,sql-server,sql-insert,sqldataadapter,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.InsertComman

这段代码对我很有用:

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
不能转换为字符串


有没有办法完成我所渴望的一行呢

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


然后,您可以在一行中设置参数。

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

然后,您可以执行以下操作:

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr.ConvertNull()

您可以将sometr强制转换为对象

例如:

da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr==null ? DBNull.Value : (object)someStr;
或者,您可以按照Oded和Servy的建议,使用扩展方法。虽然它可以添加几行代码,但它可以避免重复代码

正如Servy所指出的,把它放在
对象上可能会导致混乱。出于这个原因,我将把它放在
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);

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

您可以将sometr强制转换为object@cadrell0你的方法有效!请作为答案发布,以便我可以接受。我们在过去通过casting:(object)DBNull.Value完成了这项工作。(或类似的相近语法)可能的重复是优雅的,但无法达到减少代码行数的目的。@scatmoi-为什么这个目标如此可取?如果你正确地考虑了这样一个函数,它可以被重用为许多参数,从而减少了总体开销。Moi-嗯,MS包含它的第一个反对意见是它很容易由你自己实现。他们不可能预见到每个人可能有的需求——你能想象如果他们不停在某个地方,框架库的大小会是多少吗?这很好。但是将额外的代码行从一个地方移动到另一个地方。我希望ConvertNull()是一个C#库函数。@scatmoi如果你只做一次,它会增加代码行数。如果你做了不止一次,它就会减少。如果你碰巧只做过一次,那么就不要做这个方法(但我怀疑是这样的);通过将其放在通用扩展中,为intellisense for
对象添加额外的“杂波”可能弊大于利。@Servy等人你当然是对的,但这提出了一个问题:微软为什么没有在任何VS版本中提供这一库方法?@scatmoi嗯,首先,这对你来说很容易,你没有理由需要他们为你做这件事。其次,与其他任何功能一样,它不存在,因为它没有:1)考虑2)选择用于开发2)编码3)测试4)部署。我的猜测是这一个在#1之前停止,如果不在那里,那么#2。语言功能“默认情况下不存在”,除非有理由将其排除在外。默认情况下,在完成实现这些功能所需的所有步骤之前,不会实现这些功能。
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).SetValue(someStr);
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = ((object)someStr) ?? DBNull.Value;