我在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中的查询表没有相应的东西?
我建议你创建一个传递查询,让它工作。您可以创建+运行PT查询而无需任何代码。使用Access UI获取100%的PT查询,然后尝试代码。
所以创建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查询,它将为您保存+管理连接字符串。
尝试使用Driver = Microsoft ODBC for Oracle;而不是Driver = {Microsoft ODBC for Oracle}。后者是ADO格式。