Я впервые работаю над приложением VB, используя базу данных SQL,
У меня есть столбец Removing_Date
в одной из моих таблиц со смешанными входными данными (текст и даты).
например (Никогда, Решение будет принято позже или точные даты, например (21.08.2024))
Я пытаюсь отфильтровать его по диапазону дат, если это дата, или по тексту, если это текст.
так вот мой код
If CHK_RemovingDate.Checked = True Then
If CHK_RemovingDateText.Checked = False Then
Sql_Command = "Select * From Main Where CASE IsDate([RemovingDate]) When True Then [RemovingDate] Between '" & RemovingDate1.Value & "' And '" & RemovingDate2.Value & "' End Case"
ElseIf CHK_RemovingDateText.Checked = True Then
Sql_Command = "Select * From Main Where [RemovingDate] LIKE '%" & TXT_RemovingDate_Text.Text & "%'"
End If
End If
это база данных Sql Server
Это действительно неприятное дизайнерское решение. В столбце не должно быть смешанных типов. Никогда. Оставьте столбец как Тип даты, добавьте битовые столбцы для каждого случая. И как можно быстрее узнайте, что такое и как предотвратить Sql Injection
у вас недостижимый код из-за используемой вами логики IF. Первый IF позволяет коду выполняться только в том случае, если флажок установлен, но следующая строка никогда не будет истинной. рассмотрите возможность перезаписи блока if/else
это два разных флажка (CHK_RemovingDate) и (CHK_RemovingDateText)
Не создавайте SQL с конкатенацией строк: это уязвимо для SQL-инъекций! Всегда параметризуйте свои запросы.
Не используйте SELECT *
в реальном коде: запишите имена столбцов в том порядке, в котором вы хотите, чтобы они возвращались. В противном случае столбцы могут быть возвращены в любом порядке.
ElseIf
на самом деле может быть просто Else
, потому что он либо отмечен, либо нет. Кроме того, было бы проще понять, изменив условное выражение: If CHK_RemovingDateText.Checked Then ... Else ... End If
. И = True
или = False
не нужны. Checked
уже является логическим значением.
Несмотря на все полезные советы, представленные в комментариях, один правильный синтаксис для предложения WHERE (для вашего первого запроса):
WHERE TRY_CAST([RemovingDate] as DATE) BETWEEN 'yyyy-mm-dd' AND 'yyyy-mm-dd'
TRY_CAST пытается преобразовать текст в RemovingDate в дату. Результат зависит от формата даты в текстовой форме и региональных настроек хоста SQLServer. Он возвращает NULL, если текст не может быть преобразован в действительную дату (и NULL BETWEEN... возвращает false). Было бы лучше, если бы дата в текстовой форме соответствовала формату гггг-мм-дд (порядок компонентов даты ISO). Если нет, но формат соответствует, вы можете использовать TRY_CONVERT с правильным параметром стиля. Если у вас есть дата в специальной форме
...не забывая, что BETWEEN
включает первый параметр и исключает второй параметр, но somedate >= firstdate AND somedate <= lastdate
часто является тем, что подразумевается.
Спасибо @tinazmu. Я использовал TRY_CONVERT следующим образом, и это сработало Select * From Main Where TRY_Convert(Date,[RemovingDate],103) Between '" & RemovingDate1.Value & "' And '" & RemovingDate2.Value & "'
что такое база данных на сервере?