2010-02-03 78 views
1

我正在尝试使用ADO.NET通过存储过程进行数据库更新。带日期时间参数问题的ADO.NET更新命令

基本上我设置的所有参数和命令,并且已经设置像下面

DbParameter nm8 = provider.CreateParameter(); 
nm8.ParameterName = "@EDITDATE"; 
nm8.DbType = System.Data.DbType.DateTime; 
nm8.Value = aObject.ADateTime; 
command.Parameters.Add(nm8); 

在存储过程中的参数中的一个,该输入参数被定义为

@EDITDATE  datetime = null, 

和基本上存储的proc所做的只是获得一条记录,并通过传入的EDITDATE进行更新。

但我收到此错误

将数据类型varchar转换为datetime时出错。

,什么我发现是,时间值被传递到存储过程作为像下面

2010-02-03 15:26:54.3100000 

代替

2010-02-03 15:26:54.310 

,我认为这是什么原因造成的铸造错误。

所以我的问题是为什么ado.net以该格式转换日期时间? 如何解决该问题而不以字符串形式传递值。

非常感谢。

回答

0

当然,这将引发在SQL Server 2005中的错误:

print cast('2010-02-03 15:26:54.3100000' as datetime) 

,而这工作得很好:

print cast('2010-02-03 15:26:54.31' as datetime) 

但是......是不是aObject.ADateTime的DateTime类型?这听起来像是以字符串的形式传递给存储过程。

如果它确实是一个字符串,我建议将其转换为DateTime你通过它以前:

nm8.Value = DateTime.Parse(aObject.ADateTime); 
+0

感谢您的答复, ADateTime确实是DateTime类型。 这就是我不明白,DbType设置为DateTime 和传入的值也是一个DateTime对象(DateTime?精确) 这不是我需要做的吗?为存储过程中的日期时间参数? – Eatdoku 2010-02-04 01:42:46

+0

@Eatdoku这绝对很奇怪。我从来没有将DateTime传递给存储过程的任何问题。你需要多少精度?你可以将DateTime四舍五入到最接近的秒数吗? – 2010-02-04 01:52:56

+0

在我的情况下,最接近的一秒就足够了。 但我认为问题在于如何。net传递给存储过程时将DateTime转换为字符串。 我现在的解决方案是直接传递DateTime.Tostring(格式)作为DbType.String,它工作正常。 仍然对知道ado.net如何转换datetime以及为什么会看到这个奇怪的结果感兴趣。 谢谢 – Eatdoku 2010-02-04 16:53:41

0

你是否有程序对基类也可以使用的SqlParameter? (假设你使用连接到SQL Server),也许你可以尝试设置SqlDbType属性

SqlParameter sqlParam = (SqlParameter)nm8; //check if it's compatible before casting. 
sqlParam.SqlDbType = SqlDbType.DateTime 
+0

好点,我正在使用SQL Server。但是,而不是SqlDatProvider我使用DbProvider。也许这就是为什么转换的DataTime字符串与SQL Server期望的有所不同。 – Eatdoku 2010-02-10 17:41:32