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

VB.NET操作Access表函数报语法错误求助(同代码别处可用)

问题分析与修正方案

核心语法错误点

  • SELECT语句的WHERE子句中,两个条件之间缺少AND关键字,且Access中日期值必须用#包裹,不能直接拼接日期变量
  • UPDATE语句中,FreezeHrs是数值类型,错误地用单引号包裹;日期条件同样未用#包裹,导致SQL语法不合法
  • 未处理查询结果为空的情况,若rs1无数据,rs1.Rows.Item(0)会引发索引越界异常
  • 未正确释放数据库连接、命令等资源,存在内存泄漏风险

修正后的代码

Function FlattenTable(Current As String, Freezefrom As Date, DateRef As Date, db As String)
    Dim date1 As Date
    Dim sql1 As String
    Dim FreezeHrs As Double
    Dim FreezeLnds As Long
    Dim rs1 As New DataTable
    
    ' 使用Using语句自动释放资源
    Using con As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & db)
        con.Open()
        
        date1 = IIf(Freezefrom > DateRef, Freezefrom, DateRef)
        
        ' 参数化查询避免SQL注入与语法错误
        sql1 = "SELECT * FROM [Hours & Landings & Cycles] WHERE [A/C] = ? AND [DATE] = ?"
        Using cmd As New OleDb.OleDbCommand(sql1, con)
            cmd.Parameters.AddWithValue("?", Current)
            cmd.Parameters.AddWithValue("?", date1)
            
            rs1.Load(cmd.ExecuteReader())
            
            ' 判断是否有查询结果
            If rs1.Rows.Count > 0 Then
                FreezeHrs = CDbl(rs1.Rows(0)(3))
                FreezeLnds = CLng(rs1.Rows(0)(4))
                
                ' 执行更新操作,同样使用参数化
                sql1 = "UPDATE [Hours & Landings & Cycles] SET [HRS] = ? WHERE [A/C] = ? AND [DATE] >= ?"
                Using updateCmd As New OleDb.OleDbCommand(sql1, con)
                    updateCmd.Parameters.AddWithValue("?", FreezeHrs)
                    updateCmd.Parameters.AddWithValue("?", Current)
                    updateCmd.Parameters.AddWithValue("?", date1)
                    
                    updateCmd.ExecuteNonQuery()
                End Using
            End If
        End Using
    End Using
End Function

关键优化说明

  • 参数化查询:替代字符串拼接,彻底避免SQL注入风险,同时解决日期、数值类型的语法适配问题
  • Using语句:自动管理数据库连接、命令等资源的释放,无需手动调用Close/Dispose
  • 空结果判断:添加rs1.Rows.Count > 0的检查,防止索引越界异常
  • 简化日期赋值:用IIf函数替代If-Else语句,代码更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:36:01