binadi007 Ответов: 2

Преобразование типа данных varchar в тип данных datetime привело к значению вне диапазона.


Привет,

Я получаю "
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
" ошибка
при выполнении sql-запроса как "
Select * from table where [Date]=CONVERT(VARCHAR,'" + DateTime.Now.Date.ToShortDateString() + "',111)"
"

Как "111" для формата гггг / ММ/ДД
"103" - это формат ДД / ММ/гггг
"101" - это формат ММ/ДД/гггг

но все равно иногда работают, а иногда нет. Как и на моем локальном компьютере, он работает правильно, так как я устанавливаю время своей системы соответствующим образом, но при развертывании на сервере он не работает. Есть ли полное решение, как использовать дату в запросе как в любом формате?

Спасибо

Что я уже пробовал:

Я использовал весь формат, т. е.
As "111" is for yyyy/mm/dd format
"103" is for dd/mm/yyyy format
"101" is for mm/dd/yyyy format

чтобы преобразовать время, но это работает на какой-то платформе, а на какой-то нет

[no name]

Сообщение об ошибке совершенно ясно. Проверьте настройки вашего сервера.

binadi007

какие настройки проверить на сервере?

2 Ответов

Рейтинг:
12

OriginalGriff

Просто: никогда не объединяйте строки для формирования SQL-команды - это очень опасно, а также вызывает такие проблемы преобразования, как это. Вместо этого всегда используйте параметризованные запросы и передавайте значение DateTime напрямую без преобразования. Ваш код больше не будет подвергаться атакам SQL-инъекций, и ваша проблема исчезнет в то же время.


binadi007

Может у плз тоже привести пример, относящийся к вашей ситуации
Спасибо

binadi007

это правильный путь?
string sql = " Select * from table where [Date]=@Date";
Sqlcommand объект sqlcommand, который = новая команда sqlcommand(SQL, с);
свойство sqlcommand.Параметры.AddWithValue ("@Date", DateTime.Now.Date.ToShortDateString());
инт к = demoClass.Checkid(sqlCommand);

OriginalGriff

Это лучше, но не преобразуйте его в строку: система понимает значения DateTime и автоматически передает их в SQL в нужном формате, поэтому преобразование не требуется.
Таким образом, нет никаких шансов на путаницу между форматом даты сервера и форматом даты по умолчанию локального компьютера.

binadi007

Вместо
свойство sqlcommand.Параметры.AddWithValue ("@Date", DateTime.Now.Date.ToShortDateString());
Я использовал
свойство sqlcommand.Параметры.AddWithValue ("@Date", SqlDbType. DateTime2);

OriginalGriff

Почему?
Передайте значение напрямую...

свойство sqlcommand.Параметры.AddWithValue("@Дата", Даты И Времени.Сейчас.Дата);

Рейтинг:
1

Patrice T

Прежде всего, вам нужно проверить значение DateTime.Now.Date.ToShortDateString()- иногда вы можете получить сюрприз.
Ответ зависит от настроек компьютерной культуры.
Используйте отладчик, чтобы увидеть значение во время выполнения программы.
-----
Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.
-----

Цитата:
Выбрать * из таблица где [дата]=конвертировать(тип varchar,'" + Датавремя.Сейчас.Дата.ToShortDateString() + "',111)"
Никогда не делайте этого, потому что это способствует вводу пользователем команды SQL и может привести к проблеме, называемой SQL-инъекцией.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
Решение SQL-инъекции также решит вашу проблему, так как sql server будет знать, что ваша дата-это дата.