2009-08-12 2 views
1

Обновление не может работать.Обновление проблемы в .NET

sqlstr ="UPDATE emp SET bDate='"+Convert.ToDateTime(txtbDate.Text)+"'"; 

не может обновить таблицу emp. Я также попытался использовать метод Parse. Он выдает сообщение об ошибке: Преобразование типа данных символа в тип данных даты и времени приводило к значению даты и времени вне диапазона. Заявление было прекращено.

+0

Просто интересная записка; Если ваш формат имеет следующую форму: YYYY-MM-DD HH: MM: SS (например, 2009-08-12 12:27:50), SQL Server всегда будет анализировать его правильно, независимо от ваших региональных настроек. –

+1

Посмотрите, почему параметры являются вашим другом: http://stackoverflow.com/questions/1263125/how-does-sql-query-parameterisation-work/1263142#1263142 – Eric

ответ

4

Вы должны всегда использовать параметры sql при принятии ввода от пользователя. Это, вероятно, решит вашу проблему, а также повысит безопасность. Попробуйте это:

sqlstr ="UPDATE emp SET [email protected]"; 
SqlCommand.Parameters.AddWithValue("@bDate", Convert.ToDateTime(txtbDate.Text)); 
+2

Я согласен с параметризацией, но рекомендую не использовать .AddWithValue поскольку он может не вести себя так, как вы ожидаете, поскольку на самом деле не указывается базовый тип данных. например http://chrisrickard.blogspot.com/2007/06/addwithvalue-is-evil.html – AdaTheDev

-1

она должна быть простой строка, потому что вы храните его в sqlstr;)

2

Вы можете использовать параметризованные хранимые процедуры.

. Datetime .net содержит больше значений, чем SQL DateTime, поэтому ошибка вне диапазона.

Параметрированные хранимые процедуры также обеспечивают большую защиту от атак с SQL-атакой.

2

Вы можете убить 2 зайцев и использовать параметр:

UPDATE emp SET [email protected] 

И заполняем значение параметра с даты непосредственно, используя DateTime.Parse(), чтобы выполнить преобразование. Это также устраняет проблему с SQl-инъекцией, которую вы сейчас имеете.

3

Не использовать AdHoc SQL, как это использовать параметризованные SQL:

sqlstr = "UPDATE emp SET [email protected] WHERE...." 

Затем на вашем SqlCommand, добавьте параметр @NewDate:

YourSqlCommand.Parameters.Add("@NewDate", SqlDbType.DateTime); 
YourSqlCommand.Parameters["@NewDate"].Value = Convert.ToDateTime(txtbDate.Text); 
0

использовать параметры передать дату в запрос это, если вы используете OLE DB:

sqlstr = "UPDATE emp SET bDate=? " 
command.Parameters.Add(New OleDbParameter("@bDate", Convert.ToDateTime(txtbDate.Text))) 
1

вы пробовали разобрать значение даты в формате SQL (YYYY-MM-DD), экс 2000-12-31

Convert.ToDateTime(txtbDate.Text).ToString("yyyy-MM-dd"); 

Приветствия.

+0

Я буду тестировать ваши решения с параметризованным запросом в ближайшее время. , но Convert.ToDateTime (txtbDate.Text) .ToString ("yyyy-MM-dd") отлично работает. Я пробовал это более полудня. Спасибо dkartopr Спасибо всем – Dejene

0

«Преобразование типа данных символа в тип данных даты и времени приводило к значению даты и времени вне диапазона. Оператор был прерван».

Дата дате не в диапазоне, принятом SQL DateTime. Какую дату вы пытаетесь разобрать? У меня эта ошибка для некоторых действительно ранних дат (например, 1/15/103). Даты хранятся в тиках с произвольной начальной точки.

Точка старта для .net является 1/1/0001
Начальной точкой для SQL является 1/1/1753

Я не уверен, что конечные значения. Попробуйте запустить их и сравнить. Любая трассировка кода или сценарий консоли.

DateTime netDate = DateTime.MinValue;
SqlDateTime sqlDate = SqlDateTime.MinValue; DateTime netMaxDate = DateTime.MaxValue;
SqlDateTime sqlMaxDate = SqlDateTime.MaxValue;

Прочитайте, что все остальные сказали о параметризации запросов.

+0

Почему это было downvoted? Это непосредственно обращается к его фактической ошибке (неудачное преобразование из-за того, что время даты выходит за пределы диапазона) –

Смежные вопросы