0 голосов
спросил от в категории VBNET
Наиболее вероятная причина - плохой дизайн в вашей БД. Из значений, которые вы показываете, похоже, что ваш столбец даты в БД является VARCHAR или NVARCHAR, а не DATE.
Когда вы это сделаете, ваши сравнения для дат будут строковыми сравнениями, что означает, что все сравнение основанный на первом различном символе в двух строках. Никаких дополнительных символов не проверяется.
Это означает, что порядок сортировки для «нормальных intgers» становится:
1 10 11 ... 19 2 20 21 ... 29 3 30 ...
И очень похожее упорядочение сортировки происходит с датами.
Решение прост: измените дизайн БД и всегда сохраняйте значения в соответствующих типах данных. Целочисленные значения int INT, с плавающей запятой в FLOAT или DECIMAL, даты в DATE или DATETIME. Если вы этого не сделаете, вы получаете хлопот каждый раз, когда пытаетесь их использовать ...

И как сказал Ричард: никогда не объединяйте строки для создания команды SQL. Это дает вам широкое распространение для случайной или преднамеренной атаки SQL Injection, которая может уничтожить всю вашу базу данных. Всегда используйте Параметрированные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что 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';
Совершенно корректный SELECT
DROP TABLE MyTable;
Совершенно корректная команда «удалить таблицу»
--'
И все остальное - комментарий.
Таким образом, он: выбирает любые соответствующие строки, удаляет таблицу из БД и игнорирует что-либо еще.

Таким образом, ВСЕГДА используйте параметризованные запросы! Или будьте готовы регулярно восстанавливать свою БД из резервной копии. Вы делаете резервные копии регулярно, не так ли?

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
0 голосов
ответил от
Как указано
UPDATE DW SET DateOfEvent = CDate(Date)
# [
Dim sCon As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}WB001.mdb;Jet OLEDB:Database Password=jhk312;", Application.StartupPath) Dim sSql As String = "SELECT * FROM DW1 WHERE DateOfEvent BETWEEN @dt1 And @dt2;" Using con1 As OleDbConnection = New OleDbConnection(sCon) con1.Open() Using cmd1 As OleDbCommand = New OleDbCommand(sSql, con1)     With cmd1.Parameters     .Add("@dt1", OleDbType.Date).Value = DateTimePicker1.Value     .Add("@dt2", OleDbType.Date).Value = DateTimePicker2.Value     End With     Dim adp As New OleDbDataAdapter(cmd1)     adp.Fill(dtable)     DataGridView1.DataSource = dtable End Using     con1.Close() End Using
#], вы должны изменить поле Date на соответствующий тип данных. Примечание: вам также нужно изменить свое имя, потому что Date - #reserved word # [#^ #] для MS Access. Использование зарезервированных слов может вызвать несколько проблем ...

Как изменить тип данных?
1. Откройте базу данных в #exclusive mode # [5 ####]
2. Откройте DW таблицу в режиме дизайна
3. Добавьте новое поле, например: DateOfEvent и выберите Date тип данных (разрешить nulls)
4. Сохраните изменения и закройте таблицу DW
5. Создайте новый запрос и выполните:
UPDATE DW SET DateOfEvent = CDate(Date)

6. Если обновление прошло успешно, вы можете удалить поле Date

Хорошо, уважаемый комментарий #Richard Deeming # [#^ #] о #Sql Injection # [#^ #], вы должны использовать параметризованные запросы вместо конкатенированных строк: < br>
Кажется, вы были близки к правильному решению. Вот «улучшенная» версия вашего кода:
Dim sCon As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}WB001.mdb;Jet OLEDB:Database Password=jhk312;", Application.StartupPath) Dim sSql As String = "SELECT * FROM DW1 WHERE DateOfEvent BETWEEN @dt1 And @dt2;" Using con1 As OleDbConnection = New OleDbConnection(sCon) con1.Open() Using cmd1 As OleDbCommand = New OleDbCommand(sSql, con1)     With cmd1.Parameters     .Add("@dt1", OleDbType.Date).Value = DateTimePicker1.Value     .Add("@dt2", OleDbType.Date).Value = DateTimePicker2.Value     End With     Dim adp As New OleDbDataAdapter(cmd1)     adp.Fill(dtable)     DataGridView1.DataSource = dtable End Using     con1.Close() End Using


Примечание: Даже если в официальной документации указано, что Поставщик OleDb не позволяет использовать именованные параметры, вы можете их использовать, но есть одно требование: вам нужно добавлять параметры в том же порядке, что и их порядок в инструкции sql. ;)

Категории

Добро пожаловать на сайт DraftingCode Q&A (ИТ ответы), где вы можете задавать вопросы и получать ответы от других членов сообщества.

Связанных вопросов не найдено

...