формат даты vb.net из текстового поля › запрос MS SQL

У меня есть столбец даты в таблице БД, который я хочу запросить, используя дату, взятую из 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, кстати. Любая помощь наиболее ценится.

Джонси


person iamjonesy    schedule 16.04.2010    source источник


Ответы (2)


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

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

';УДАЛИТЬ ТАБЛИЦУ 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, никогда не будет заменять данные непосредственно в строке запроса. Код есть код, данные есть данные, и они никогда не сойдутся.

person Joel Coehoorn    schedule 16.04.2010
comment
строки и даты не смешиваются. Тем более, что вы, американцы, перепутали дни и месяцы ;) - person GordonB; 16.04.2010
comment
@ Джоэл. Спасибо за информацию, я не думал об этом. К счастью, это всего лишь приложение, используемое компанией. Учитывает ли ваш пример британское форматирование даты? Я отмечу это как ответ, если это так;) - person iamjonesy; 16.04.2010
comment
Спасибо за помощь. Я изменил ваше предложение, но не возвращает никаких строк. Когда я отлаживаю текст cmd, это ... ГДЕ (tblClient.ClientID = @ClientID) И (tblBackupArchive.BackupDate МЕЖДУ @datefrom И @dateto). он не имеет изменений в параметрах, казалось бы? - person iamjonesy; 16.04.2010
comment
Командный текст не изменится. Но sql, который выполняется на сервере sql, будет содержать правильные значения. - person GordonB; 16.04.2010
comment
Запустите SQL Profiler и посмотрите, что на самом деле выполняется на сервере. - person GordonB; 16.04.2010
comment
@Jonesy - весь смысл параметризованных запросов в том, что они никогда не подставляют данные в строку запроса. Данные есть данные, а код есть код, и они никогда не сойдутся. - person Joel Coehoorn; 16.04.2010

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

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

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

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

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

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

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

person GordonB    schedule 16.04.2010