Access链接SQL后VB6执行Delete报错3156及传递查询异常求助
这个问题我之前帮同事踩过类似的坑,给你几个实用的排查方向:
调整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

