2010-04-16 76 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真正从弹弦的正确格式的依赖。你只会使用日期类型。