永远不要使用这样的字符串连接来构建您的查询!!!
是的,我确实是想大喊大叫,因为日期格式是您最不关心的问题。想象一下,如果在您的日期文本框中输入以下内容,您当前的代码会发生什么:
';删除表 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 server 看到的查询字符串永远不会将数据直接替换到查询字符串中。代码就是代码,数据就是数据,两者永远不会相遇。