Формат даты vb.net из текстового поля › запрос MS SQL
Автор вопроса: iamjonesyОтветов: 2
У меня есть столбец даты в таблице БД, который я хочу запросить, используя дату, взятую из textbox.text. пользователь выбирает дату из календаря в формате дд/мм/гггг. Я хочу использовать эту дату для ввода запроса. Как отформатировать дату, чтобы иметь возможность запрашивать базу данных?
Dim datefrom As String =txtDateFrom.Text
Dim dateto As String =txtDateTo.Text
Запрос будет выглядеть так:
WHERE (tblClient.ClientID = " & ClientID & ") AND (tblBackupArchive.BackupDate BETWEEN '" + datefrom + "' AND '" + dateto + "')"
Я использую MS SQL Server, кстати. Любая помощь наиболее ценится.
НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ТАКОЕ ОБЪЕДИНЕНИЕ СТРОК ДЛЯ СОЗДАНИЯ ЗАПРОСОВ!!!
И да, я хотел крикнуть, потому что форматирование даты - наименьшая из ваших проблем. Представьте, что произойдет в вашем текущем коде, если что-то введет следующее в одно из ваших текстовых полей даты:
';УДАЛИТЬ ТАБЛИЦУ tblClient;--
Вместо этого используйте параметризованный запрос. Это устранит ваши проблемы с датой и защитит от атак SQL-инъекций. Вот пример:
Dim sql As String = " .... WHERE tblClient.ClientID= @ClientID AND tblBackupArchive.BackupDate >= @DateFrom AND tblBackupArchive.Backupdate < @DateTo"
Using cn As New SqlConnection("your connection string here"), _
cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@ClientID", SqlDbType.Int).Value = ClientID
cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = DateTime.Parse(txtDateFrom.Text)
cmd.Parameters.Add("@DateTo", SqlDbType.DateTime).Value = DateTime.Parse(txtDateTo.Text).AddDays(1)
cn.Open()
cmd.Execute___()
End Using
Теперь вы можете думать об этом так, как если бы вы выполнили оператор sql, похожий на этот:
DECLARE @ClientID Int
DECLARE @DateFrom DateTime
DECLARE @DateTo DateTime
Set @ClientID = ImaginaryFunctionToGetQueryData('ClientID')
Set @DateFrom = ImaginaryFunctionToGetQueryData('DateFrom')
Set @DateTo = ImaginaryFunctionToGetQueryData('DateTo')
SELECT ...
FROM ...
WHERE tblClient.ClientID= @ClientID
AND tblBackupArchive.BackupDate >= @DateFrom
AND tblBackupArchive.Backupdate < @DateTo
"ImaginaryFunction" в этом коде выполняется с использованием хранимой процедуры sp_executesql, но дело в том, что строка запроса, видимая сервером sql, никогда не будет заменять данные непосредственно в строке запроса. Код есть код, данные есть данные, и они никогда не сойдутся.
Ответ 2 · рейтинг 1 · GordonB
Как дополнение к ответу Джоэла....
Я бы вообще избегал использования каких-либо строк в уравнении. ИЕ; Не используйте текстовые поля для хранения дат, используйте правильный календарь или средства выбора даты и времени.
Таким образом, вы не зависите от того, действительно ли DateTime.parse выбирает правильный формат из вашей строки. И вы будете использовать только типы даты.