【问题标题】:vb.net date format from textbox > MS SQL query来自文本框 > MS SQL 查询的 vb.net 日期格式
【发布时间】:2026-01-12 08:40:01
【问题描述】:

我在数据库表中有一个日期列,我想使用从 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。非常感谢任何帮助。

琼斯

【问题讨论】:

    标签: vb.net sql-server-2008 date-format


    【解决方案1】:

    切勿使用这样的字符串连接来构建您的查询!!!

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

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

    【讨论】:

    • 字符串和日期不能混用。尤其是因为你们美国人把你的日子和月份弄错了;)
    • @乔尔。感谢您的信息,我没有想到。值得庆幸的是,它只是公司使用的一个应用程序。您的示例是否考虑了英国日期格式?如果有,我会将其标记为答案;)
    • 感谢您的帮助。我已经改变了你的建议,但它没有返回任何行。当我调试 cmd 文本是“...WHERE (tblClient.ClientID = @ClientID) AND (tblBackupArchive.BackupDate BETWEEN @datefrom AND @dateto)。它似乎没有更改参数?
    • cmdtext 不会改变。但是在 sql server 上执行的 sql 会包含正确的值。
    • 运行 SQL Profiler,看看服务器上实际执行了什么。
    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】: