2011-03-03 42 views
8

我有一个存储过程,但我有传递NULL存储过程传递一个空的DateTime字段中存储过程

领域麻烦使用我公司供应的参数,更新数据库我需要NULL是一个DateTime字段

DB.Parameters.AddWithValue("@date", NULL) 

这给我的错误

'NULL' 未声明。 '空'常数不再被支持;使用“System.DBNull”,而不是

所以,我想

DB.Parameters.AddWithValue("@date", DBNull.Value.ToString()) 

但是这将产生值1900-01-01 00:00:00.000在列,因为它是传递一个""到外地

我也试过

DB.Parameters.AddWithValue("@date", DBNull.Value) 

但它产生这个错误

类型'System.DBNull'的值不能转换为'String'。

有没有人有任何想法?

+0

如果完全省略参数会发生什么? – 2011-03-03 14:33:03

+1

@米克,那也失败了。我想看看他的sp期望的是什么 – hunter 2011-03-03 14:35:57

+1

小心使用'.AddWithValue'调用 - 在这种情况下.NET如何知道您的参数应该是什么**类型**如果您传入'DBNull.Value '?见卢克的答案 - **具体**,你会为自己节省很多的伤心! (并且真的很难找到错误!) – 2011-03-03 15:29:03

回答

12

尝试这样的事情,使用Add而不是AddWithValue

DB.Parameters.Add("@date", SqlDbType.DateTime).Value = DBNull.Value; 
+0

+1正确 - ADO.NET应该如何判断**类型**如果您传入'DBNull.Value',您的参数将会变为?清楚明确! – 2011-03-03 15:27:44

2

试试这个

如果您使用的类和它的属性和这些属性值作为参数,那么你就可以做到这一点

chnage物业的

public DateTime? myDateTime = null;// Here ? is used to make the property nullable. 
签名

另外,如果您的日期列的类型为varchar,则将其更正为Date(Sql2008)/ DateTime(2005)。

//改变参数,这

@SomeDate datetime = null (as suggested by chris) 

让现场接受空,然后传递价值

DB.Parameters.Add("@date", DBNull.Value) 
+0

不会改变任何东西 - 问题是使用'AddWithValue'和'DBNull.Value',ADO.NET运行时不知道你想要的是什么类型..... – 2011-03-03 15:29:50

12

或者您可以添加参数这样的,这使得它数据库中的空值如果变量为空:

DB.Parameters.AddWithValue("@date", myDateTime ?? (object)DBNull.Value); 

您需要将其设置为Amit提到的可空类型。

更多细节及可用的背景在http://evonet.com.au/overview-of-c-nullable-types/

0

这是一个例子。它适用于我

if(obj.myDate == DateTime.MinValue) 
{ 
    aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = DBNull.Value; 
} 
else 
{ 
    aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = obj.myDate ; 
} 
相关问题