访问直通无 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 下打开保存的查询也反映了相同的错误...不知道为什么。 据我所知,连接字符串并不是给定您当前代码的精确副本(例如 UidUID)。我通常的建议是创建一个文件 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 WITH 访问对 Oracle 的直通查询

对 Oracle DB 的直通查询中的 MS 访问表达式

刷新访问直通查询

ms访问;如何将其移入无法访问状态/无DSN表没有密码

毫秒访问;如何在没有密码的情况下将其移动到不可访问状态/无 DSN 表

在 ms 访问中调用 oracle 存储过程而不在传递查询中保存密码