Ошибка: преобразование типа данных nvarchar в тип данных smalldatetime привело к значению вне допустимого диапазона - PullRequest
5 голосов
/ 22 февраля 2010

Привет всем, я пытаюсь сделать следующий запрос вставки

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 ]

3 голосов
/ 22 февраля 2010

Что ваше заявление 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 для дат (ГГГГММДД) - это работает для ВСЕХ региональных и языковых настроек в SQL Server - это работает ??

DECLARE @test TABLE (smalldate SMALLDATETIME)
INSERT INTO @test VALUES ('20100221 22:00:32') --
SELECT * FROM @test
1 голос
/ 14 апреля 2011

У меня была такая же проблема при добавлении datetime.now в столбец Date моего сервера SQL, для которого установлен тип данных SmallDateTime.

Разобраться было довольно просто (после многих попыток !!)

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

Это вернет дату в формате, ожидаемом сервером

0 голосов
/ 18 апреля 2013

В Windows 8, если вы столкнулись с этой проблемой даже после изменения Formats в расположении ниже

Панель управления -> Регион

Вам все еще нужно передать эти настройки своим пользователям. В том же окне перейдите на вкладку «Административный», нажмите на кнопку «Копировать настройки».

Установите соответствующие флажки и нажмите OK.

0 голосов
/ 22 февраля 2010

Попробуйте не преобразовывать дату в строку:

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

Редактировать: Попробуйте это тогда:

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

Есть еще один способ просто передать фактический объект, но я не могу вспомнить ... извините.

0 голосов
/ 22 февраля 2010

Попробуйте изменить это:

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

к этому:

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