严禁使用字符串连接像那样构建查询!
是的,我的意思是说,因为日期格式是你的问题最少。想象一下,在当前的代码会发生什么,如果有什么输入了以下到您的日期文本框之一:
“; 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 server所看到的查询字符串不会直接将数据替换为查询字符串。代码是代码,数据是数据,从来不会遇到这样的情况。
字符串和日期不会混合。特别是因为你美国人把你的日子和月份错误的方式;) – GordonB 2010-04-16 14:23:51
@Joel。感谢您的信息,我没有这样做。谢天谢地,它只是一个与该公司一起使用的应用程序。您的示例是否考虑了英国日期格式?如果有问题,我会将其标记为答案;) – iamjonesy 2010-04-16 14:29:22
感谢您的帮助。我改变了你的建议,但它没有返回任何行。当我调试cmd文本是“... WHERE(tblClient.ClientID = @ClientID)和(tblBackupArchive.BackupDate BETWEEN @datefrom AND @dateto)。它没有改变它看起来的参数? – iamjonesy 2010-04-16 14:58:39