0

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

2 回答 2

0

尝试在 web.config 中设置 uiculture 和culture。

<globalization uiCulture="en-GB" culture="en-GB"/>

您的传递日期格式和 sql 日期可以不同。因此,根据您的文化设置文化。

于 2012-07-17T10:36:08.060 回答
0

我刚遇到类似的问题哥们!

这是因为C#转换date timeMM-DD-YYYSQL server 生成date time基于DD-MM-YYYY.

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

于 2013-07-24T20:03:29.670 回答