Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Формат даты 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, кстати. Любая помощь наиболее ценится.

Джонси

sql-server-2008date-format

Ответы

Ответ 1 · рейтинг 7 · Joel Coehoorn

НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ТАКОЕ ОБЪЕДИНЕНИЕ СТРОК ДЛЯ СОЗДАНИЯ ЗАПРОСОВ!!!

И да, я хотел крикнуть, потому что форматирование даты - наименьшая из ваших проблем. Представьте, что произойдет в вашем текущем коде, если что-то введет следующее в одно из ваших текстовых полей даты:

';УДАЛИТЬ ТАБЛИЦУ 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

Как дополнение к ответу Джоэла....

Я бы вообще избегал использования каких-либо строк в уравнении. ИЕ; Не используйте текстовые поля для хранения дат, используйте правильный календарь или средства выбора даты и времени.

Таким образом, вам не придется этого делать;

cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = DateTime.Parse(txtDateFrom.Text)

как предлагает Джоэл, но вместо этого вы можете просто сделать;

cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = dtDateFrom.value

Таким образом, вы не зависите от того, действительно ли DateTime.parse выбирает правильный формат из вашей строки. И вы будете использовать только типы даты.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы