You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET操作Access数据库时日期筛选失效及类型转换异常问题

解决方案

1. 修复查询逻辑优先级问题

原查询返回全部数据的核心原因是OR与AND的运算符优先级:AND优先级高于OR,导致原语句实际逻辑为:

(client_name匹配) OR (company_name匹配) OR (registration_no匹配 AND 日期在范围内)

只要前两个条件任意一个满足,就会忽略日期筛选返回所有数据。需将三个OR条件用括号包裹,再与日期条件用AND关联:

' 先修正逻辑结构,后续再处理日期格式问题
str = "Select * from [ledger] WHERE ([client_name]='" & client_name.Text & "' OR [company_name]='" & company_name.Text & "' OR [registration_no]='" & reg_no.Text & "') AND [date] Between #...# And #...#"

2. 解决Access日期格式与DateTimePicker异常

Access的DateTime字段要求用#包裹日期,且推荐使用MM/dd/yyyy或yyyy-MM-dd格式(注意#与日期之间不要加空格)。你遇到的InvalidCastException是因为依赖系统区域的ToShortDateString可能输出不符合要求的格式,应显式指定日期格式:

正确的日期格式转换写法

Dim fromDateStr As String = from_date.Value.ToString("MM/dd/yyyy")
Dim toDateStr As String = To_Date.Value.ToString("MM/dd/yyyy")
str = "Select * from [ledger] WHERE ([client_name]='" & client_name.Text & "' OR [company_name]='" & company_name.Text & "' OR [registration_no]='" & reg_no.Text & "') AND [date] Between #" & fromDateStr & "# And #" & toDateStr & "#"

3. 推荐使用参数化查询(彻底规避格式错误与SQL注入)

字符串拼接不仅容易出现格式问题,还存在SQL注入风险,建议用OleDbCommand参数化查询:

Dim connStr As String = "你的Access数据库连接字符串"
Using conn As New OleDbConnection(connStr)
    conn.Open()
    Dim sql As String = "SELECT * FROM [ledger] WHERE ([client_name] = ? OR [company_name] = ? OR [registration_no] = ?) AND [date] BETWEEN ? AND ?"
    Using cmd As New OleDbCommand(sql, conn)
        ' 直接传入原始值,无需手动处理格式
        cmd.Parameters.AddWithValue("@clientName", client_name.Text)
        cmd.Parameters.AddWithValue("@companyName", company_name.Text)
        cmd.Parameters.AddWithValue("@regNo", reg_no.Text)
        cmd.Parameters.AddWithValue("@fromDate", from_date.Value)
        cmd.Parameters.AddWithValue("@toDate", To_Date.Value)
        
        ' 执行并处理查询结果
        Using reader As OleDbDataReader = cmd.ExecuteReader()
            While reader.Read()
                ' 读取数据的逻辑代码
            End While
        End Using
    End Using
End Using

参数化查询的核心优势

  • OleDb会自动适配Access的DateTime类型,无需手动拼接日期格式
  • 彻底避免SQL注入攻击,提升系统安全性
  • 代码更易维护,减少格式拼接类的低级错误

内容的提问来源于stack exchange,提问作者John MacClain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:25:24