2010-04-16 60 views
1

我有一個數據庫表格中的日期列,我想查詢使用從textbox.text取得的日期。用戶從日曆中選擇格式爲dd/MM/yyyy的日期。我想使用該日期進行查詢。我如何格式化日期以查詢數據庫?從文本框的vb.net日期格式> MS SQL查詢

Dim datefrom As String =txtDateFrom.Text 
    Dim dateto As String =txtDateTo.Text 

查詢將是這樣的:

WHERE (tblClient.ClientID = " & ClientID & ") AND (tblBackupArchive.BackupDate BETWEEN '" + datefrom + "' AND '" + dateto + "')" 

我使用MS SQL Server的BTW。最受讚賞的任何幫助。

Jonesy

回答

7

嚴禁使用字符串連接像那樣構建查詢!

是的,我的意思是說,因爲日期格式是你的問題最少。想象一下,在當前的代碼會發生什麼,如果有什麼輸入了以下到您的日期文本框之一:

「; 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所看到的查詢字符串不會直接將數據替換爲查詢字符串。代碼是代碼,數據是數據,從來不會遇到這樣的情況。

+0

字符串和日期不會混合。特別是因爲你美國人把你的日子和月份錯誤的方式;) – GordonB 2010-04-16 14:23:51

+0

@Joel。感謝您的信息,我沒有這樣做。謝天謝地,它只是一個與該公司一起使用的應用程序。您的示例是否考慮了英國日期格式?如果有問題,我會將其標記爲答案;) – iamjonesy 2010-04-16 14:29:22

+0

感謝您的幫助。我改變了你的建議,但它沒有返回任何行。當我調試cmd文本是「... WHERE(tblClient.ClientID = @ClientID)和(tblBackupArchive.BackupDate BETWEEN @datefrom AND @dateto)。它沒有改變它看起來的參數? – iamjonesy 2010-04-16 14:58:39

1

,正如除了喬爾的回答....

我會避免公式中使用任何字符串的。 IE IE; IE;不要使用文本框來存儲日期,請使用適當的日曆或日期時間選擇器。

這樣,你不必這樣做;

cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = DateTime.Parse(txtDateFrom.Text) 

正如Joel所建議的那樣,但是您可以這樣做;

cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = dtDateFrom.value 

這樣你不就DateTime.parse真正從彈弦的正確格式的依賴。你只會使用日期類型。