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

如何用VBA将Redshift表链接至MS Access并避免ISAM错误

解决MS Access链接AWS Redshift表时的“找不到可安装的ISAM”错误及崩溃问题

问题背景

现有MS Access应用,原链接本地SQL Server Express实例表,测试迁移至AWS Redshift:

  • 已在Redshift重建测试表,本地创建DSN
  • VBA的ADODB.Connection可正常连接DSN并查询到正确结果
  • 手动通过DSN链接Redshift表时Access崩溃
  • 用VBA(DAO)创建链接表时,TableDefs.Append步骤报错**“找不到可安装的ISAM”**
  • 环境:Office 365 + 2.00.00.06版本x64 Amazon Redshift ODBC驱动,三种连接字符串均无效

现有连接代码(ADODB)

Public Function GetRSConn(Optional ByVal TimeOut As Long = -1) As ADODB.Connection
On Error GoTo ErrorHandler
    Dim strConn As String
    
    If IsEmpty(dbRSConn) Or dbRSConn Is Nothing Then
        Set dbRSConn = New ADODB.Connection
        dbRSConn.CommandTimeout = 0
        
        strConn = "DSN=CPP_RS"
        dbRSConn.ConnectionString = strConn
        dbRSConn.CursorLocation = adUseClient
        dbRSConn.Open
    End If
    If TimeOut <> -1 Then
        dbRSConn.CommandTimeout = TimeOut
    End If
    Set GetRSConn = dbRSConn
Exit Function
ErrorHandler:
    Select Case Err.Number
    Case Else
        MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
        Resume
    End Select
End Function

现有链接表代码(DAO)

Sub TestLinkingToRS()
    Dim tdf As New DAO.TableDef
    Dim strConnectionString As String
    With CurrentDb
    .TableDefs.Refresh
    Set tdf = .CreateTableDef("tblTestRS")
    'strConnectionString = "Driver={Amazon Redshift (x64)};Server=serverstuff.amazonaws.com;Database=theDatabase;UID=theUserID;PWD=thePassword;Port=thePortNo"
    'strConnectionString = "DSN=CPP_RS;UID=theUserID;PWD=thePassword"
    strConnectionString = "DSN=CPP_RS"
    tdf.Connect = strConnectionString
    tdf.SourceTableName = "database.schema.tblTest"
    .TableDefs.Append tdf
    .TableDefs.Refresh
    End With
    Set tdf = Nothing
End Sub

解决方案

1. 补全DAO连接字符串的ODBC;前缀

DAO创建ODBC链接表时,连接字符串必须以ODBC;开头,缺失该前缀是触发ISAM错误的核心原因。修改后的连接字符串示例:

strConnectionString = "ODBC;DSN=CPP_RS"
' 或带账号密码的版本
strConnectionString = "ODBC;DSN=CPP_RS;UID=theUserID;PWD=thePassword"

2. 确保Office与ODBC驱动位数匹配

确认Office 365为x64版本(与使用的x64 Redshift ODBC驱动一致)。若Office是32位,需更换为32位Redshift ODBC驱动,位数不匹配会导致链接时崩溃或权限类错误。

3. 修正SourceTableName格式

Redshift表名无需带数据库名(DSN已指定目标数据库),正确格式为schema.tablename:

tdf.SourceTableName = "schema.tblTest"

若使用默认public schema,可简化为tblTest。

4. 优化链接表创建逻辑(避免重复创建)

添加同名表检查与删除逻辑,避免重复创建导致的异常:

Sub TestLinkingToRS()
    Dim tdf As DAO.TableDef
    Dim strConnectionString As String
    Dim db As DAO.Database
    
    Set db = CurrentDb
    ' 删除已存在的同名链接表
    On Error Resume Next
    db.TableDefs.Delete "tblTestRS"
    On Error GoTo 0
    
    db.TableDefs.Refresh
    Set tdf = db.CreateTableDef("tblTestRS")
    
    ' 必须添加ODBC前缀
    strConnectionString = "ODBC;DSN=CPP_RS"
    tdf.Connect = strConnectionString
    ' 修正表名格式
    tdf.SourceTableName = "schema.tblTest"
    
    db.TableDefs.Append tdf
    db.TableDefs.Refresh
    
    Set tdf = Nothing
    Set db = Nothing
End Sub

5. 手动链接表的正确操作

手动链接时,在“外部数据”->“ODBC数据库”流程中,选择“创建链接表”后,需确保连接字符串前添加ODBC;前缀;同时检查ODBC数据源管理器中DSN的配置:

  • 确认服务器地址、端口、数据库名正确
  • 测试DSN连接,验证账号对目标表的访问权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:33:15