我在将C#DateTime值传递给SQL Server 2005存储过程时遇到问题。
存储过程采用类型为DateTime
的参数,并使用传递的值更新数据库列(列也是datetime
类型):
ALTER PROCEDURE [dbo].[ProcedureName]
@id int,
@eta datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRANSACTION
UPDATE
TrackingTable
set
ETA = @eta
where
ID = @id
COMMIT TRANSACTION
END
通过创建datetime
并执行参数化非查询,将C#SqlParameter
值传递给存储过程。
我可以通过分析器看到执行的SQL是:
exec ProcedureName @id=19020, @eta='2012-07-17 10:29:34:000'
如果我直接在数据库上执行此操作,则更新工作正常,但是通过我的C#程序,它失败并显示错误:
生成了char数据类型到datetime数据类型的转换 在超出范围的日期时间值。声明已经终止。
我确定自己很愚蠢,但我不能为我的生活看错了。 PS我是SQL Server的新手!
任何帮助表示赞赏! 感谢。
抱歉c#代码:
dbWrapper.ExecuteProcWithParams("ProcedureName",
dbWrapper.CreateParameter("id", Header.VoyageID),
dbWrapper.CreateParameter("eta", ETA)
ETA是日期时间值。
public void ExecuteProcWithParams(string procName, params DbParameter[] parameters)
{
try
{
using (DbCommand cmd = db.CreateCommand())
{
cmd.Transaction = trans;
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
foreach (DbParameter param in parameters)
{
cmd.Parameters.Add(param);
}
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
throw;
}
}
public DbParameter CreateParameter(string name, object value)
{
DbParameter result = null;
switch (databaseType)
{
case DatabaseType.SqlServer:
// Sql Server: NULL parameters have to initialised with DBNull rather than NULL
result = new SqlParameter(name, value ?? DBNull.Value);
break;
default:
throw new Exception(String.Format("Unknown database type {0}", databaseType));
}
return result;
}
答案 0 :(得分:0)
尝试在web.config中设置uiculture和culture。
<globalization uiCulture="en-GB" culture="en-GB"/>
您的传递日期格式和SQL日期可能不同。 因此,根据您的文化设定文化。
答案 1 :(得分:0)
我刚遇到了类似的问题伙伴!
这是因为C#
会将date time
转换为MM-DD-YYY
,而SQL服务器会根据date time
生成DD-MM-YYYY
。
这就是为什么你的月份会出现越界错误。