将C#DateTime值传递给SQL Server存储过程时出错

时间:2012-07-17 10:25:39

标签: c# sql-server

我在将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;
 }

2 个答案:

答案 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

这就是为什么你的月份会出现越界错误。