vb.net формат даты из текстового поля> MS SQL запрос - PullRequest
1 голос
/ 16 апреля 2010

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

Джоунси

Ответы [ 2 ]

7 голосов
/ 16 апреля 2010

НИКОГДА НЕ ИСПОЛЬЗУЙТЕ КОНЦЕНТРАЦИЮ СТРОК, КАК ДЛЯ СОЗДАНИЯ ВАШИХ ЗАПРОСОВ !!!

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

'; DROP TABLE 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, никогда не подставит данные непосредственно в строку запроса. Код - это код, данные - это данные, и они никогда не встретятся.

1 голос
/ 16 апреля 2010

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

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

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

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

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

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

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

...