访问直通无 DSN 的 Oracle 查询
Posted
技术标签:
【中文标题】访问直通无 DSN 的 Oracle 查询【英文标题】:Access Passthrough DSN-less Oracle Query 【发布时间】:2017-12-18 19:21:34 【问题描述】:我在 Excel 中有一些东西可以从没有 DSN 的 Oracle 数据库返回我的表:
With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DRIVER=Microsoft ODBC for Oracle;CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" & IP1 & ")(PORT=XXXX))" & _
"(CONNECT_DATA=(SERVICE_NAME=" & SvcNm & ")));" & _
"UID=" & UserName & ";" & _
"PWD=" & PassWord & " & ";", Destination:=Range("A1"))
.Sql = strSQL
.FieldNames = False
.RefreshStyle = xlOverwriteCells
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.HasAutoFormat = False
.BackgroundQuery = False
.TablesOnlyFromhtml = True
.Refresh BackgroundQuery:=True
.SavePassword = False
.SaveData = True
.Delete
End With
这可以让我得到我想要的东西。但是如果我想在 Access 中使用类似的方法,我尝试了这个:
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Set db = CurrentDb
Set qdf = db.CreateQueryDef("")
qdf.Connect = "ODBC;DRIVER=Microsoft ODBC for Oracle;CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" & IP & ")(PORT=XXXX))(CONNECT_DATA=(SERVICE_NAME=" & svcname & ")));" & _
"Uid=" & Username & ";PWD=" & password &";"
qdf.Sql = "---some query"
qdf.ReturnsRecords = True
Set rs = qdf.OpenRecordset
我在这里得到一个错误:
这里有什么我可以做的吗?或者 Access 中没有对应的查询表?
【问题讨论】:
你确定Excel和Access之间的连接字符串和SQL完全一样吗?对两者进行Debug.Print
并将它们粘贴到文本编辑器中进行比较。
相同。我正在从一个复制粘贴到另一个。我还验证了来自connectionstrings.com/oracle 的连接字符串,以确保我正确使用它。这是我使用正确的连接字符串时遇到的错误,其他任何内容都会导致 ODBC 错误。
对于 QueryTables 的等效项,删除记录集调用并在释放 qdf Set qdf = Nothing
后简单地打开查询 Set qdf = Nothing
以保存更改。这将打开一个类似 Excel 的表格,或者更确切地说是 Excel 打开一个类似 Access 的表格!
这样做的错误完全相同。在侧面板的 Access 下打开保存的查询也反映了相同的错误...不知道为什么。
据我所知,连接字符串并不是给定您当前代码的精确副本(例如 Uid
与 UID
)。我通常的建议是创建一个文件 DSN,并将其调整为连接字符串。
【参考方案1】:
我建议您创建一个传递查询,并让它工作。您无需任何代码即可创建 + 运行 PT 查询。使用 Access UI 让 PT 查询 100% 工作,然后尝试代码。
所以创建 PT 查询。当您在 Access UI 中单击该 PT 查询时,它会起作用吗?
一旦(并且仅在之后)您使该查询正常工作,您就可以在如下代码中运行该 PT 查询:
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("qryPassR")
如果你需要修改oracle查询的原始SQL,那么你可以去:
Dim rst As DAO.Recordset
With CurrentDb.QueryDefs("qryPassR")
.SQL = "select * from tblHotels"
Set rst = .OpenRecordset
End With
如果你想执行一个存储过程,那就去吧
With CurrentDb.QueryDefs("qryPassR")
.SQL = "exec storedProc"
.ReturnsRecords = False
.Execute
End With
因此,一旦您创建了一个有效的 PT 查询,您就可以在上面的代码中反复使用它。所以无需将连接字符串的东西放在代码中——只需创建 PT 查询,它就会为您保存 + 管理连接字符串。
【讨论】:
在完全没有 VBA 的情况下尝试通过 PT 执行时遇到了同样的错误。在 PT ODBC Conn Str 输入中使用相同的 Connectionstring。根据connectionstring.com,这是正确的。所以我不确定为什么我会收到错误。 我会创建一个新的连接。另一种方法是按 ctrl-g 跳转到调试窗口,然后输入 ? currentdb.TableDefs("linked table name").Connect - 换句话说,从链接表中获取现有且已知且有效的连接并使用它。因此,在简单的 PT 查询 100% 从 Access UI 工作之前,尝试 VBA 代码是没有用的。您的连接根本无法正常工作。你有一个工作链接表吗? (如前所述,从中获取连接信息)。 因此,归根结底,您需要与服务器建立一个简单且基本的连接。如果没有链接表或任何其他连接不起作用,那么在此过程中担心代码为时过早。您必须使简单的链接表正常工作,并且必须使基本连接正常工作。不要在简单地让连接正常工作的同时尝试解决 VBA 代码。让一个简单的链接表工作。我的意思是,如果您的连接从未成功,并且您没有有效的连接,那么这个问题与您最初的问题和帖子的关系几乎为零。【参考方案2】:尝试使用 Driver=Microsoft ODBC for Oracle;而不是 Driver=Microsoft ODBC for Oracle。后者是ADO格式。
【讨论】:
DAO 中的 DSN-less 需要 DSN=;参数以上是关于访问直通无 DSN 的 Oracle 查询的主要内容,如果未能解决你的问题,请参考以下文章