Member 13101003 Ответов: 2

Проблема сравнения даты и времени


у меня есть база данных ms access со столбцом datetime "resolved on" ....В М приложении на C# у меня есть два datetimepickers.... datetimepicker1 является от даты и datetimepicker2-это 'на сегодняшний день'

мой SQL-запрос
строка запроса = "выбрать количество(*) из инцидентов, где [решен] > У '" + dateTimePicker1.Значение + "' и [решен] &ЛТ; '" + dateTimePicker2.Значение + "' ";

я получаю эту ошибку >> несоответствие типа данных в выражении критериев

столбец ms access имеет длинный формат datatime
формат datetimepickers-это длинная дата

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

string query = "select count(*) from incidents where [resolved on] > '" + dateTimePicker1.Value + "' and [resolved on] < '" + dateTimePicker2.Value + "' ";

Richard MacCutchan

Какой тип данных является столбцом [resolved on]?

Member 13101003

значение datetime

Richard MacCutchan

Меню выбора даты.Стоимость такая же, как и в документации. Вам нужно более тщательно изучить свой код, чтобы точно понять, почему происходит несоответствие. Вы уверены, что MSAccess DateTime имеет тот же формат?

Member 13101003

Как узнать, совпадает ли формат или нет?

Richard MacCutchan

Вам нужно проверить документацию для обоих типов.

2 Ответов

Рейтинг:
2

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

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

Когда вы его параметризовали, проблема может исчезнуть - но если это не так, то вам нужно проверить дизайн вашей БД и убедиться, что столбец "Resolved On" установлен как DATE, DATETIME или DATETIME2 - если это VARCHAR или NVARCHAR, то он никогда не будет работать должным образом, так как сравнение строк проводится по символам, а результат всего сравнения является результатом первой другой пары символов. Это бесполезно для дат, потому что так же, как и с числами, это приводит к такому порядку сортировки:
1
10
11
...
19
2
20
21
...
что для тебя совершенно бесполезно.


Рейтинг:
0

Patrice T

Единственный разумный способ обработки дат и времени-это использовать тип данных DateTime как в C#, так и в Access.
Все, что видит Access, - это строка, она никак не может знать, что это дата и что она означает.
Чтобы сравнить такую строку, вы должны переупорядочить части в 'yyyymmdd' с транскодированием месяца в ее номер. И это для каждой даты, которую вы хотите сравнить.


Member 13101003

это только дата и время

Patrice T

в чем же вопрос ?

Member 13101003

я получаю ошибку "несоответствие типа данных в выражении критериев"

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
и покажи, что ты сейчас делаешь.

Member 13101003

у меня есть база данных ms access со столбцом datetime "resolved on" ....В М приложении на C# у меня есть два datetimepickers.... datetimepicker1 является от даты и datetimepicker2-это 'на сегодняшний день'

мой SQL-запрос
строка запроса = "выбрать количество(*) из инцидентов, где [решен] > У '" + dateTimePicker1.Значение + "' и [решен] &ЛТ; '" + dateTimePicker2.Значение + "' ";

я получаю эту ошибку >> несоответствие типа данных в выражении критериев

столбец ms access имеет длинный формат datatime
формат datetimepickers-это длинная дата

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
чтобы другие обратили внимание на эту информацию.

Member 13101003

строка запроса = "выбрать количество(*) из инцидентов, где [решен] &ГТ;= #" + dateTimePicker1.Значение + "# и [решен] &ЛТ;= #" + dateTimePicker2.Значение + "# ";

Это работает

Patrice T

Приятно видеть, что вы решили эту проблему.