Access连接Oracle出现#Error行导出失败,求SQL过滤方案及权限内配置方法
问题根因说明
你遇到的错误本质是Oracle后端表中某个/某几个Decimal类型字段的数值精度,超过了Access链接表预设的字段精度阈值,导致Access读取时无法解析,抛出#Error和精度不足警告。以下3种方案均不需要数据库管理员权限,你可直接操作:
方案1:修改SQL查询语句,过滤或转换错误行
无需修改宏逻辑,仅调整查询语句即可解决,是成本最低的方案。
写法A:转换数值字段避免精度溢出
先在Access中打开ADAS_PCO_OIT链接表的设计视图,找到所有字段类型为「小数/数字」的字段,在SQL中对这类字段做强制转换:
SELECT 非数值字段1, 非数值字段2, -- 对所有小数字段做转换,比如截断为2位小数,或转成文本避免精度校验 ROUND(疑似出错的小数字段1,2) AS 小数字段1, CStr(疑似出错的小数字段2) AS 小数字段2, 其他字段 FROM ADAS_PCO_OIT -- 直接过滤无法解析的错误行 WHERE NOT IsError(疑似出错的小数字段1) AND NOT IsError(疑似出错的小数字段2);
写法B:全量过滤错误行
如果不确定哪个字段出错,可以直接用全局错误判断:
SELECT * FROM ADAS_PCO_OIT WHERE NOT IsError(ADAS_PCO_OIT.*);
注意:如果多个字段存在错误,需要逐个补充IsError判断条件
方案2:修改VBA宏,逐行读取避免批量写入中断
你当前使用的CopyFromRecordset是批量写入逻辑,遇到第一条错误行就会直接中断,所以仅导出了错误行之前的65534条数据。改成逐行遍历、跳过错误行的逻辑即可导出全部有效数据,修改后的宏代码如下:
Public Sub Bajada_OIT() Sheets("OIT").Select Dim conexion As Object Dim recordSet As Object Dim consulta As String Dim cadenaConexion As String Dim i As Long ' 行号计数器 Dim f As Object ' 字段遍历变量 Dim hasError As Boolean ' 标记当前行是否有错误 Set conexion = CreateObject("ADODB.Connection") cadenaConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\SEC\COST\COST\DIT\DIT.accdb" ' 此处可以保留原SQL,也可以替换为方案1修改后的SQL consulta = "SELECT * FROM ADAS_PCO_OIT;" conexion.Open cadenaConexion Set recordSet = conexion.Execute(consulta) i = 2 ' 从A2行开始写入 On Error Resume Next ' 遇到错误继续执行 ' 遍历所有记录行 Do While Not recordSet.EOF hasError = False ' 逐字段写入,检查是否有解析错误 For Each f In recordSet.Fields If Err.Number <> 0 Then hasError = True Err.Clear Exit For End If Sheets("OIT").Cells(i, f.OrdinalPosition + 1).Value = f.Value Next ' 无错误则行号+1,有错误则跳过当前行 If Not hasError Then i = i + 1 recordSet.MoveNext Loop On Error GoTo 0 recordSet.Close Set recordSet = Nothing conexion.Close Set conexion = Nothing MsgBox "Extraccion de Acces: ADAS_PCO_OIT (OIT) Satisfactoria. 共导出" & i - 2 & "条有效数据", vbInformation, "Ayuda" End Sub
提示:7万条数据逐行读取耗时约10-30秒,属于正常可接受范围
方案3:本地修改链接表字段精度(一劳永逸)
直接调整本地Access链接表的字段配置,从根源避免解析错误:
- 打开
DIT.accdb,右键删除原有ADAS_PCO_OIT链接表 - 点击【外部数据】选项卡 → 【导入并链接】→ 【ODBC数据库】→ 选择「通过创建链接表来链接到数据源」
- 选择原有连接Oracle的ODBC数据源,重新链接
ADAS_PCO_OIT表 - 右键打开新链接表的设计视图,找到所有「小数」类型的字段,把【字段大小】改为「双精度」,或者把【精度】调到28(Access支持的最大小数精度)、【小数位数】调到10以上
- 保存表设计后重新运行原有宏即可
内容的提问来源于stack exchange,提问作者David Donayo
相关产品推荐
相关产品推荐

