C# 将varchar数据类型转换为datetime数据类型会导致执行存储过程的值超出范围

C# 将varchar数据类型转换为datetime数据类型会导致执行存储过程的值超出范围,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我有标题错误的问题。当我尝试执行以下存储过程时,会出现错误: 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(nva

我有标题错误的问题。当我尝试执行以下存储过程时,会出现错误:

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();

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

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

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

您的问题很可能是C代码正在运行的系统时间设置将日期发送为m/d/yyyy hh:mi:ss AM 2/25/2011 11:12:13 AM,而SQL Server预期的是d/m/yyyy hh:mi:ss AM 25/2/2011 11:12:13 AM

因此,第25个月超出了SQL Server的范围

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

dbCommand.Parameters.AddWithValue("@timeStamp", DateTime.Now.ToString("s"));
您可以在此处看到日期时间格式列表
始终尽可能少地保留系统默认值。

现在它可以工作了。谢谢你的帮助。最好的建议通常是尽可能避免将日期或其他更结构化的对象视为字符串。您是对的,不同的系统有不同的表示日期的方法,但是对于像.NET->SQL Server这样的情况,ADO.NET知道如何在.NET DateTime和SQL Server DateTime对象之间进行转换。无需转换为字符串,也无需暴露字符串不明确或可能产生错误的可能性。