访问Passthrough DSN-less Oracle Query

时间:2017-12-18 19:21:35

标签: oracle vba ms-access access-vba odbc

我在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

我最终得到的错误是:

The error

我可以在这里找到任何东西,或者Access中的查询表没有相应的东西吗?

2 个答案:

答案 0 :(得分:0)

我建议你创建一个传递查询,让它工作。您可以创建+运行PT查询而无需任何代码。使用Access UI获取100%的PT查询,然后尝试代码。

所以创建PT查询。当您在Access UI中单击该PT查询时它是否有效?

一旦(并且仅在此之后)您可以使用此查询,那么您可以使用以下代码运行该PT查询:

<record id="my_rule_date_foo" model="ir.rule">
<field name="name">foo bar</field>
<field name="model_id" ref="model_my_foo"/>
<field name="domain_force">
    [('many2one_field.the_limit_date','&ge;', 'what_to_put_here_?')]
</field>
<field name="groups" eval="[(4, ref('group_peff'))]"/>
<field name="perm_read" eval="False"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_unlink" eval="False"/>

如果你需要修改oracle查询的原始SQL,那么你可以去:

Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("qryPassR")

如果您想执行存储过程,请转到

Dim rst As DAO.Recordset

With CurrentDb.QueryDefs("qryPassR")
   .SQL = "select * from tblHotels"
   Set rst = .OpenRecordset
End With

因此,一旦您创建了一个正在运行的PT查询,那么您可以在上面的代码中反复使用它。因此,无需在代码中放置连接字符串 - 只需创建PT查询,它将为您保存+管理连接字符串。

答案 1 :(得分:0)

尝试使用Driver = Microsoft ODBC for Oracle;而不是Driver = {Microsoft ODBC for Oracle}。后者是ADO格式。