Access调用带IDENTITY列的SQL Server表删除数据时Error 3622问题
问题解决办法
一、Error 3622 错误的修复方案
该错误的核心原因是:操作带有IDENTITY列的SQL Server表时,DAO执行删除/修改操作必须显式指定dbSeeChanges选项来识别标识列的变更。具体修复步骤如下:
修改VBA执行代码
在调用Execute方法时添加dbSeeChanges参数:.Execute dbSeeChanges完整执行代码段:
With qryDelFamilia .Parameters(0) = lngIdFamiliaFormativa .Execute dbSeeChanges ' 新增dbSeeChanges选项 If .RecordsAffected = 0 Then mVntMsg = "Ha sucedido un error al eliminar la familia formativa. No es posible proseguir." MsgBox mVntMsg, vbExclamation + vbOKOnly, "ERROR AL ELIMINAR" Set dbCurrDB = Nothing Exit Sub End If End With优化Access删除查询定义(可选但推荐)
原DELETE语句无需显式列出IDENTITY列,简化为更标准的写法:PARAMETERS [ID_FAMILIA_FORMATIVA] Long; DELETE FROM SEPE_FAMILIAS_FORMATIVAS WHERE SEPE_FAMILIAS_FORMATIVAS.ID_FAMILIA_FORMATIVA = [ID_FAMILIA_FORMATIVA];
二、传递查询的参数赋值方法
若要使用SQL Server传递查询实现单条记录删除,按以下步骤操作:
确认传递查询配置
确保传递查询已正确关联SQL Server的ODBC数据源,查询语句保持你提供的版本:DECLARE @ID_FAMILIA_FORMATIVA Int BEGIN DELETE FROM EDIBON_ERP.Formativa.[SEPE_FAMILIAS_FORMATIVAS] WHERE EDIBON_ERP.[Formativa].[SEPE_FAMILIAS_FORMATIVAS].ID_FAMILIA_FORMATIVA = @ID_FAMILIA_FORMATIVA ENDVBA中为传递查询赋值并执行
通过DAO.QueryDef操作传递查询时,直接通过参数名或索引赋值,同时仍需添加dbSeeChanges选项:Dim dbCurrDB As DAO.Database Dim qryDelFamilia As DAO.QueryDef Dim lngIdFamiliaFormativa As Long Set dbCurrDB = CurrentDb Set qryDelFamilia = dbCurrDB.QueryDefs("你的传递查询名称") With qryDelFamilia ' 按参数名赋值(可读性更高,推荐使用) .Parameters("@ID_FAMILIA_FORMATIVA") = lngIdFamiliaFormativa ' 或按索引赋值 ' .Parameters(0) = lngIdFamiliaFormativa .Execute dbSeeChanges ' 必须添加此选项 If .RecordsAffected = 0 Then mVntMsg = "Ha sucedido un error al eliminar la familia formativa. No es posible proseguir." MsgBox mVntMsg, vbExclamation + vbOKOnly, "ERROR AL ELIMINAR" Set dbCurrDB = Nothing Exit Sub End If End With ' 清理对象 Set qryDelFamilia = Nothing Set dbCurrDB = Nothing
关键注意事项
dbSeeChanges是必选项:无论使用本地Access查询还是SQL Server传递查询,只要操作带IDENTITY列的SQL Server表,执行删除/更新/插入操作时都需要指定该选项。- 参数类型需兼容:确保VBA变量类型(
Long)与SQL Server参数类型(Int)匹配,避免类型转换错误。
内容的提问来源于stack exchange,提问作者Maiol Salse Escudero
相关产品推荐
相关产品推荐

