1

我在数据库表中有一个日期列,我想使用从 textbox.text 获取的日期进行查询。用户从日历中选择 dd/MM/yyyy 格式的日期。我想使用该日期进行查询。如何格式化日期以便能够查询数据库?

  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 顺便说一句。非常感谢任何帮助。

琼斯

4

2 回答 2

7

永远不要使用这样的字符串连接来构建您的查询!!!

是的,我确实是想大喊大叫,因为日期格式是您最不关心的问题。想象一下,如果在您的日期文本框中输入以下内容,您当前的代码会发生什么:

';删除表 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 看到的查询字符串永远不会将数据直接替换到查询字符串中。代码就是代码,数据就是数据,两者永远不会相遇。

于 2010-04-16T14:22:38.607 回答
1

就像乔尔的回答一样......

我会完全避免在等式中使用任何字符串。IE; 不要使用文本框来存储日期,使用适当的日历或日期时间选择器。

这样,您就不必这样做了;

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

正如乔尔建议的那样,但您可以这样做;

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

这样您就不必依赖 DateTime.parse 实际上从您的字符串中选择正确的格式。而且您只会使用日期类型。

于 2010-04-16T15:43:22.890 回答