2011-12-13 73 views
2

我从数据库中提取数据(1条记录)并将每个值放入文本框或下拉列表中。其中一些值是DB.null。如果是,我将它们转换为“”(空白)。但是,一旦用户修改了文本框/下拉列表,他们就可以“保存”新的结果。我的问题是这样的:是否可以传递一个DB.null参数,并在数据库中设置一个等于该值的值?

如果用户留下一些空白,我希望能够保持该值是DB.null。有没有办法做到这一点?

另外,是否有可能,如果有一个文本框中的值,并且用户决定删除它,我也可以将它转换为DB.Null?这就是我试图做给你们的一些想法:

productName != "" 
    ? myCommand.Parameters.AddWithValue("@ProductName", productName) 
    : myCommand.Parameters.AddWithValue("@ProductName", DBNull.Value); 
+0

貌似你试图'DBNull.Value'已经,并会失败? –

+0

另一件你可以做的事情就是不将参数传递给存储过程 - 也就是说,如果没有做出选择。简单如'if txtBox.Length> 0 //传递参数其他//不传递参数' – JonH

+1

空字符串是数据库中的有效值吗?如果是的话,你将如何区分故意的空字符串和“空”空字符串? – Chris

回答

6

使用SQL Server我相信你可以互换使用nullDBNull.Value设置一个值为NULL

我也想改变你的代码如下:

myCommand.Parameters.AddWithValue(
    "@ProductName", 
    // this requires a cast as ?: must return the same type 
    String.IsNullOrWhiteSpace(productName) 
     ? (object)DBNull.Value 
     : (object)productName 
); 

或者使用null并没有进行明确的转换:

myCommand.Parameters.AddWithValue(
    "@ProductName", 
    ! String.IsNullOrWhiteSpace(productName) ? productName : null 
); 
+0

您将需要将DBNull.Value和productName转换为对象,以使?:运算符可以工作(如果不是,运算符将无法识别结果类型)。 – tpeczek

+0

@tpeczek是的,你说得对。感谢您指出了这一点。我没有在VS中运行这个。现在编辑。顺便说一句,我相信这就是为什么我在过去使用'null'的原因,因为它不需要演员。 – Yuck

+0

@Yuck你的第二种方法会工作吗?我以为null与DB.null不同? –

2

它是有效的检查空字符串,然后使用:

myCommand.Parameters.AddWithValue("@ProductName", DBNull.Value) 

如果是,这样的:

if (string.IsNullOrEmpty(ProductName)) { 

    myCommand.Parameters.AddWithValue("@ProductName", DBNull.Value); 

} else { 

    myCommand.Parameters.AddWithValue("@ProductName", ProductName); 

} 
0

如果您正在使用的.Net 2.0或以上,可考虑利用Nullable(Of T)结构。它使测试Null值变得非常简单,并且如果它们指定了值,则可以简单地将对象的.Value属性放入TextBox。这些对象默认为空,因此当您更新数据库中的记录时,如果未指定任何值,则只需保留该变量,并将NULL置入数据库中。

我承认起初有一些奇怪的事情需要处理(你必须记住在绑定到TextBox时使用.Value属性),但在初始障碍之后,如果你要去结构要处理很多可能具有空值的数据库字段。

0

最好不要将数据为中心的类型(如DBNull)与您的TextBox绑定。虽然它可能会使您的代码在数据端看起来更清晰,但没有内置的方法可以自动将空字符串与DBNull进行转换。

在你的DB一侧的清洁方法是

myCommand.Parameters.AddWithValue(
    "@ProductName", 
    productName.IsNullOrEmpty() ? (object)(DBNull.Value) : productName 
); 
0

有点较短的版本:

myCommand.Parameters.AddWithValue(
    "@ProductName", 
    productName == null ? DBNull.Value : (object)productName 
); 
相关问题