将varchar数据类型转换为日期时间数据类型导致执行存储过程的超出范围的值

时间:2014-03-21 13:58:11

标签: c# sql sql-server stored-procedures

我对Title的错误有疑问。当我尝试执行这样的存储过程时发生错误:

CREATE PROCEDURE [dbo].[insertTimeDate]
    @tableName as nvarchar(28),
    @timeStamp as datetime,
AS
DECLARE @query nvarchar(MAX);

BEGIN
SET @query = 'INSERT INTO [' +@tableName+'] (timeStamp) VALUES ('''+CONVERT(nvarchar, @timeStamp, 20)+''')'
EXEC (@query)
END

我从c#代码执行它:

    dbCommand = new SqlCommand("insertTimeDate", dbConnection);
    dbCommand.CommandType = CommandType.StoredProcedure;
    dbCommand.Parameters.AddWithValue("@tableName", "table_name");
    dbCommand.Parameters.AddWithValue("@timeStamp", DateTime.Now);
    dbCommand.ExecuteNonQuery();

2 个答案:

答案 0 :(得分:0)

尝试使用CONVERT中的样式126 - 这是适用于SQL Server的任何语言/区域设置的ISO-8601格式:

SET @query = 'INSERT INTO [' +@tableName+'] (timeStamp) VALUES (''' +
             CONVERT(nvarchar, @timeStamp, 126) + ''')'
EXEC (@query) 

答案 1 :(得分:0)

许多编码语言和SQL中的日期并不总是可以互换的。

您的问题很可能是您运行C#代码的系统时间设置,发送日期为m/d/yyyy hh:mi:ss AM2/25/2011 11:12:13 AM)且SQL Server期待d/m/yyyy hh:mi:ss AM({{1} })

所以第25个月超出了SQL Server的范围。

当您将程序从程序发送到另一个系统时,最好以ISO格式指定日期。

25/2/2011 11:12:13 AM

您可以在此处查看dbCommand.Parameters.AddWithValue("@timeStamp", DateTime.Now.ToString("s")); 格式列表http://www.dotnetperls.com/datetime-format 始终尽可能少地保留系统默认值。