.Net从变量值将NULL值插入SQL Server数据库

时间:2009-03-06 15:26:31

标签: .net sql-server database

有类似的问题,但答案不是我想要的。如果引用为NULL或尚未分配值,我想将值NULL插入SQL Server数据库。目前我正在测试null,它看起来像

String testString = null;

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

这看起来和我感觉非常笨拙。我有很多值,我插入数据库并测试它们所有像上面这样非常详细。 .Net不会以某种方式处理这个问题。我想也许如果我使用字符串而不是字符串,但这似乎也不起作用。环顾四周,我发现了一些关于使用Nullable类型的文章。

System.Nullable<T> variable

这似乎适用于原语,int?,char?双?和布尔?这可能适用于那些但是字符串呢?我在这里错过了一些东西。我应该使用什么类型的原始值和字符串值,以便我不必在插入之前重复测试值。

编辑: 在我得到关于三元运算符的太多答案之前。我喜欢他们但不喜欢这种情况。对于我来说,需要测试该值并拥有所有额外的逻辑是没有意义的,当这种事情可以在.Net框架中降低时,如果我知道要给出的类型那么它就会得到它免费。

修改 好的,所以大家帮我制定我的攻击计划。我将使用Nullable作为我的原语(int?,double?etc),对于我的Strings,我将使用String但是??测试。这使事情变得不那么冗长。我在这里缺少什么,比如可能会失去一些语义?

7 个答案:

答案 0 :(得分:11)

比三元组更好的是双问号(??)运算符。采用第一个非空值。所以:

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

会给你一个值为DBNull.Value的parm,但是

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

会给你一个parm,其中“A String”为值。

答案 1 :(得分:3)

Nullable非常适合原始人。我将不得不测试字符串的行为,但至少清理代码的一个选项是定义字符串的扩展方法。

你可以用??字符串运算符:

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

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

修改

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我有时会做的是:

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

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

答案 4 :(得分:0)

我同意SqlParameter.Value必须设置为DbNull.Value是笨拙而且有点不幸。但是没有办法绕过它,所以你必须忍受测试null。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

示例:

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

这将插入null