НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ТАКОЕ ОБЪЕДИНЕНИЕ СТРОК ДЛЯ СОЗДАНИЯ ЗАПРОСОВ!!!
И да, я хотел крикнуть, потому что форматирование даты — наименьшая из ваших проблем. Представьте, что произойдет в вашем текущем коде, если что-то введет следующее в одно из ваших текстовых полей даты:
';УДАЛИТЬ ТАБЛИЦУ 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