我在将 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
我通过创建SqlParameter
并执行参数化非查询将 C#值传递给存储过程。
我可以通过分析器看到执行的 SQL 是:
exec ProcedureName @id=19020, @eta='2012-07-17 10:29:34:000'
如果我直接在数据库上执行此更新工作正常,但通过我的 C# 程序失败并出现错误:
将 char 数据类型转换为 datetime 数据类型会导致 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;
}