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