有类似的问题,但答案不是我想要的。如果引用为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但是??测试。这使事情变得不那么冗长。我在这里缺少什么,比如可能会失去一些语义?
答案 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
。