【问题标题】:Error: The conversion of a nvarchar data type to a smalldatetime data type resulted in an out-of-range value错误:将 nvarchar 数据类型转换为 smalldatetime 数据类型导致值超出范围
【发布时间】:2011-01-19 10:28:33
【问题描述】:

大家好,我正在尝试执行以下插入查询

SqlDataSource userQuizDataSource = new SqlDataSource();
userQuizDataSource.ConnectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=quizApp;Integrated Security=True";
userQuizDataSource.InsertCommand = "INSERT INTO [UserQuiz] ([DateTimeComplete], [Score], [UserName]) VALUES (@DateTimeComplete, @Score, @UserName)";

userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now.ToString());
userQuizDataSource.InsertParameters.Add("Score", score.ToString());
userQuizDataSource.InsertParameters.Add("UserName", User.Identity.Name);

int rowsAffected = userQuizDataSource.Insert();

但不断收到以下错误:

nvarchar 数据类型的转换 导致 smalldatetime 数据类型 在一个超出范围的值。 该语句已终止。

谁能帮帮我?

【问题讨论】:

    标签: c# sql-server exception-handling ado.net sql-insert


    【解决方案1】:

    你的声明DateTime.Now.ToString()返回什么??

    您的 SQL Server 需要什么语言和区域设置?

    你那里不匹配???也许您的 .NET 返回 MM/dd/yyyy 格式,而 SQL Server 需要 dd/MM/yyyy(反之亦然)。

    在您的 SQL Server 中尝试此代码:

    DECLARE @test TABLE (smalldate SMALLDATETIME)
    INSERT INTO @test VALUES ('02/21/2010 22:00:32') --
    SELECT * FROM @test
    

    用您从 .NET 的 DateTime.Now.ToString() 获得的输出替换我的字符串 - 这行得通吗? SQL Server 是否会为您提供更好的错误消息?

    接下来,尝试对日期使用 ISO-8601 格式 (YYYYMMDD) - 这适用于 SQL Server 中的 ALL 区域和语言设置 - 这有效吗??

    DECLARE @test TABLE (smalldate SMALLDATETIME)
    INSERT INTO @test VALUES ('20100221 22:00:32') --
    SELECT * FROM @test
    

    【讨论】:

    • 非常感谢......这行得通!我认为问题更多在于我机器上的日期格式与服务器上的不同!
    • .net 以 dd/MM/yyyy 的格式返回日期,当我检查 SQL Server 时,日期格式是美国风格!!
    • 我迄今为止使用的从 .net 到 sql 的最安全的“日期时间”格式是“yyyy-MM-dd HH:mm:ss.fff”。 PK :-)
    【解决方案2】:

    我在将 datetime.now 添加到我的 SQL 服务器列“日期”设置为数据类型 SmallDateTime 时遇到了同样的问题。

    解决它很简单(经过多次尝试!!)

    string currentdatetime=
    DateTime.Now.Year + "." + DateTime.Now.Month + "." + DateTime.Now.Day +
                   " " + DateTime.Now.Hour+(":")+DateTime.Now.Minute+(":")+DateTime.Now.Second
    

    这会将日期返回为服务器期望的格式

    【讨论】:

      【解决方案3】:

      尝试改变这个:

      userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now.ToString());
      

      到这里:

      userQuizDataSource.InsertParameters.Add("@startdate", SqlDbType.DateTime, DateTime.Now.ToString());
      

      【讨论】:

      • 我现在得到 2 个新错误 1) 'System.Web.UI.WebControls.ParameterCollection.Add(string, string)' 的最佳重载方法匹配有一些无效参数 2) 参数 '2' : 无法从 'System.DateTime' 转换为 'string'
      【解决方案4】:

      尽量不要将日期转换为字符串:

      userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now);
      

      编辑:然后试试这个:

      userQuizDataSource.InsertParameters.Add("DateTimeComplete", TypeCode.DateTime, DateTime.Now.ToString());
      

      还有另一种方法可以传递实际对象,但我不记得了..抱歉。

      【讨论】:

      • 我现在得到 2 个新错误 1) 'System.Web.UI.WebControls.ParameterCollection.Add(string, string)' 的最佳重载方法匹配有一些无效参数 2) 参数 '2' : 无法从 'System.DateTime' 转换为 'string'
      • 对不起,你是对的。实际上还有另一种添加对象的方法,即日期时间,但我不记得了,目前还没有打开 VS。在实际数据源上尝试并寻找类似 AddParameterValue..(string name, object value).. 的方法
      【解决方案5】:

      在 Windows 8 中,如果您在以下位置更改 Formats 后仍遇到此问题

      控制面板 -> 区域

      您仍然需要将这些设置转移给您的用户。在同一窗口中,转到“管理”选项卡,单击复制设置。

      选中相应的复选框并单击OK

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 2016-10-22
        • 2017-03-31
        • 1970-01-01
        • 2014-04-19
        相关资源
        最近更新 更多