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

Access链接SQL后VB6执行Delete报错3156及传递查询异常求助

解决VB6操作Access链接SQL表时的删除错误问题

这个问题我之前帮同事踩过类似的坑,给你几个实用的排查方向:

  • 调整DELETE语句的语法
    Access里兼容DELETE * FROM TABLENAME的写法,但ODBC驱动对接SQL Server时,可能会因为SQL Server本身不支持带星号的DELETE语法(标准SQL是DELETE FROM),导致VB6端触发语法校验错误。试试把语句改成DELETE FROM TABLENAME再执行,大概率能解决这个问题。

  • 换用直接连接SQL Server的ADO方式
    如果你的VB6代码是通过Access的DAO对象操作链接表,不妨试试直接用ADO连接SQL Server,绕开Access的中间层。这样能避免DAO对链接表的额外校验逻辑,代码示例如下:

    Dim conn As New ADODB.Connection
    Dim strConn As String
    
    strConn = "Driver={ODBC Driver 17 for SQL Server};Server=你的SQL服务器地址;Database=目标数据库;Uid=用户名;Pwd=密码;"
    conn.Open strConn
    conn.Execute "DELETE FROM TABLENAME" ' 直接执行SQL Server原生语句
    conn.Close
    Set conn = Nothing
    
  • 检查链接表的主键映射
    Access链接SQL Server表时,如果源SQL表没有主键,或者Access里的链接表没正确映射主键,就可能出现“SQL已经执行成功,但VB6收到错误”的情况。打开Access,找到这个链接表,右键查看设计视图,确认主键已经正确设置(和SQL Server表的主键一致),如果没有就手动指定。

  • 修正VB6调用传递查询的方式
    如果你想用传递查询,不要直接调用Access里保存的查询对象,而是在VB6里动态创建传递查询,手动指定ODBC连接参数,避免缓存的连接信息干扰。用DAO的示例代码:

    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    
    Set db = OpenDatabase("你的Access数据库路径.mdb")
    Set qdf = db.CreateQueryDef("") ' 创建临时传递查询
    qdf.Connect = "ODBC;Driver={ODBC Driver 17 for SQL Server};Server=...;Database=...;Uid=...;Pwd=..."
    qdf.SQL = "DELETE FROM TABLENAME"
    qdf.ReturnsRecords = False ' 删除操作不需要返回记录
    qdf.Execute dbFailOnError ' 执行并捕获错误
    
    Set qdf = Nothing
    db.Close
    Set db = Nothing
    
  • 更新ODBC驱动版本
    旧版的SQL Server ODBC驱动可能存在兼容性问题,建议换成最新的ODBC Driver 17 for SQL Server,它对现代SQL Server版本的支持更好,错误处理逻辑也更完善。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:06:35