嚴禁使用字符串連接像那樣構建查詢!
是的,我的意思是說,因爲日期格式是你的問題最少。想象一下,在當前的代碼會發生什麼,如果有什麼輸入了以下到您的日期文本框之一:
「; 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