错误:将nvarchar数据类型转换为smalldatetime数据类型会导致超出范围的值

时间:2010-02-21 21:37:48

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

嘿所有我正在尝试执行以下插入查询

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

Buti不断收到以下错误:

  

nvarchar数据类型的转换   到了smalldatetime数据类型的结果   在超出范围的价值。   声明已经终止。

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:3)

你的陈述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

答案 1 :(得分:1)

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

要解决这个问题非常简单(经过多次尝试!!)

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

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

答案 2 :(得分:0)

尝试更改此内容:

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

到此:

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

答案 3 :(得分:0)

请勿尝试将日期转换为字符串:

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

编辑:然后尝试:

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

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

答案 4 :(得分:0)

在Windows 8中,如果您在更改以下位置的Formats后面临此问题

  

控制面板 - >区域

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

选中相应的复选框,然后点击OK