クエリを作成するために、そのような文字列連結を使用しないでください!!!
はい、私は大声で叫ぶつもりでした. 日付テキスト ボックスの 1 つに次のようなものが入力された場合、現在のコードで何が起こるか想像してみてください。
';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 サーバーから見たクエリ文字列がデータをクエリ文字列に直接置き換えることは決してないということです。コードはコードであり、データはデータであり、2 つが一致することはありません。