【问题标题】:Sql Expression to Filter Records That has the Current System Date用于过滤具有当前系统日期的记录的 Sql 表达式
【发布时间】:2016-04-07 08:18:41
【问题描述】:

我有一个 VB 应用程序和 MS Access 数据库作为后端。我想将我的数据库上的所有记录显示到具有当前系统日期的 Datagrid。 我的sql语句有问题,不知道该怎么办。

显示错误“条件表达式中的数据类型不匹配”

  sqlqry = "Select * FROM tblAttendance WHERE WorkingDate >= '#" & 
                           DateTime.Now.ToShortDateString() & "#'"    
    da = New OleDbDataAdapter(sqlqry, cnn)   
    Dim dt As New DataTable("tblAttendance")
    da.Fill(dt)
    Me.dgvAttendance.DataSource = dt
    DataGridProperty(dgvAttendance)
    DataGridAttendance(dgvAttendance)

【问题讨论】:

  • 去掉单引号
  • 删除整个日期表达式并使用内置的Date() 函数,例如WHERE WorkingDate()>=Date()。您也应该不惜一切代价避免使用字符串连接,因为这会使您面临 SQL 注入攻击、性能不佳 格式不匹配 - ToShortDateString 使用当前系统的语言环境,而这可能 没有 匹配日期文字格式。
  • @Panagiotis Kanavos,多亏了你,它确实有效,一个非常好的避免 sql 注入的建议,我会注意的。 sqlqry="SELECT * FROM tblAttendance WHERE WorkingDate = Date()"

标签: vb.net ms-access-2010


【解决方案1】:

DateTime 作为字符串传递给您的查询可能存在问题。

我的建议是使用参数,因为 OleDB 集成会注意正确地将参数传递给 MS Access

Dim sqlqry As String = "Select * FROM tblAttendance WHERE WorkingDate >= ?"
Dim da As New OleDbDataAdapter(sqlqry, cnn)

da.SelectCommand.Parameters.Add(New OleDb.OleDbParameter("@WorkingDate", DateTime.Now))

Dim dt As New DataTable("tblAttendance")
da.Fill(dt)
Me.dgvAttendance.DataSource = dt
DataGridProperty(dgvAttendance)
DataGridAttendance(dgvAttendance)

从我的脑海中写出来,但这应该可以。

【讨论】:

  • 好建议,虽然Date() 函数可以专门返回当前日期。
【解决方案2】:

应该这样做:

sqlqry = "Select * FROM tblAttendance WHERE WorkingDate = #" & DateTime.ToDay.ToString("yyyy'/'MM'/'dd") & "#"    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多