如何用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
相关产品推荐
相关产品推荐

