.NET如何将变量值插入SQL Server数据库时,插入NULL值?

6

之前有类似的问题,但是答案不是我想要的。如果引用为NULL或者还没有被分配值,我想将NULL值插入到SQL Server数据库中。目前我正在测试是否为空,代码如下:

String testString = null;

if (testString == null)
{
    command.Parameters.AddParameter(new SqlParameter("@column", DBNull.Value);
}
else
{
    command.Parameters.AddParameter(new SqlParameter("@column", testString);
}

对我来说,这看起来感觉非常笨拙。我有很多值要插入到数据库中,像上面那样测试它们非常冗长。.Net难道没有以某种方式处理这个问题吗?我想也许如果我使用string而不是String,但似乎也不起作用。我找到了一些文章,讲述如何使用可空类型。

System.Nullable<T> variable

这似乎对于基元类型,如int?、char?、double?和bool?有效。那么这些可能适用于这些类型,但是字符串呢?我有什么遗漏吗?我应该使用哪种类型来表示原始值和字符串值,以便在插入它们之前不必反复测试值。
编辑: 在我得到太多关于三元运算符的答案之前,我喜欢它们,但在这种情况下不适用。如果我知道要给什么类型,那么它本可以在.NET框架中实现更低级别,并且如果我知道要使用的类型,则可以免费获得它。
编辑: 好的,那么帮我制定攻击计划。我将使用Nullable来处理我的基元类型(int?,double?等),对于我的字符串,我将使用String但进行??测试。这使得代码更简洁。我是否遗漏了什么内容,例如失去某些语义?
7个回答

11

双问号(??)运算符比三元运算符更好用。它返回第一个非空值。所以:

string x = null;
command.Parameters.AddParameter(
     new SqlParameter("@column", (object)x ?? DBNull.Value);

它会给你一个值为DBNull.Value的参数,但是

string x = "A String";
command.Parameters.AddParameter(
     new SqlParameter("@column", (object)x ?? DBNull.Value);

会给你一个参数,其值为"A String"。


1
编译器会出错,因为它无法将字符串隐式转换为DBNull。 - LukeH
你是正确的。你需要将字符串(x)向下转换为对象。编辑后的示例。 - Walden Leverich
不喜欢这样做,因为它容易让.Net猜错参数的类型。最好通过一种请求SqlDbType枚举的重载来指定参数类型。 - Joel Coehoorn

3

Nullable在原始数据类型上表现出色。我需要测试字符串的行为,但至少可以定义一个字符串的扩展方法来清理代码。

您可以使用??运算符处理字符串:

command.Parameters.AddParameter(new SqlParameter("@column", myNull ?? (object)DBNull.Value);

如果第一个项目不为空,则??返回第一个项目,否则返回第二个项目。

编辑

修复了上面的代码,以便编译需要将DBNull.Value强制转换为对象。


编译器会因为无法将字符串隐式转换为 DBNull 而出错。 - LukeH
我相信你可以使用 testString ?? (string) DBNull.Value。 - Jakob Christensen
((object) testString) ?? DBNull.Value 怎么样? - recursive

0

有时我会这样做:

command.Parameters.Add ("@column", SqlDbType.VarChar).Value = DBNull.Value;

if( String.IsNullOrEmpty (theString) == false )
{
    command.Parameters["@column"].Value = theString;
}

0

或许三元运算符是你觉得有用的东西。


0

我同意这有点笨拙和不幸的是,必须将SqlParameter.Value设置为DbNull.Value。但是没有其他办法,所以你必须接受测试null的现实。


0

Nullable<T> 无法应用于 String,因为它是一个引用类型而不是值类型。


嗨。刚查了一下,很失望的是,string仍然是一个引用类型,而不是String。显然它是一个别名,但是例如string a = "hello"; string b = "h"; b += "ello"; 然后a == b返回true,因为它比较它们的值。有趣的。 - uriDium
是 & 否 - 字符串为什么是引用类型而不是值类型有很好的理由(看看Jon Skeet在这个领域的一些东西,他是专家); 对于您指定的这种情况,这就是为什么他们创建了StringBuilder类。 - Gavin Miller

0

例子:

if (txtDisplayName.Text != "")
{
    insert into table (id,display_name) values ('" + txtID.Text + "','" + txtDisplayName.Text + "');
}
else
{
    insert into table (id) values ('" + txtID.Text + "');
}

这将插入null


你好,欢迎来到 Stack Overflow!这是一段不完整的代码片段。 - Jesse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接