1

我正在通过 ODBC 连接到 Jet 4 DB。Jet DB 使用对 Oracle DB 的传递查询。到目前为止,这有效(不能直接访问 pt 查询,但在查询上创建视图就可以了)。

我需要一些 p-ts 返回的数据子集。参数最好,但不支持。

两个问题:

1) Jet 似乎确实能够将一些 where 子句推送给 Oracle。例如,我有一个返回 100k 行的直通查询。带有单个过滤子句(例如“district = '1010'”)的 pt 视图非常快,因此处理似乎发生在 Oracle 上。添加更多子句会使查询减慢到爬行速度,在 CPU 使用率高的情况下循环数分钟。是否有关于在 Jet 侧传递的内容和完成的内容的任何文档?

2) 有很多关于如何使用 VBA/Access 创建动态直通查询的教程。是否可以使用通过 ODBC 访问的 Jet 来执行此操作(或任何类似的操作)?

谢谢马丁

编辑: 对不起,不清楚。

我有一个通过 ODBC 访问 Jet db 的报告工具。Jet db 包含一些数据和几个到 Oracle db 的直通查询。一个典型的用例是使用来自 Jet 和 Oracle 的数据为给定部门和给定日期生成报告。这在原则上非常有效。

问题是直通查询不能包含任何参数。直通查询就像一个视图,所以我可以简单地执行“select * from pt_query where dep = 'a' and date = somedate”。然而,Jet 从 pt 加载所有行并在客户端进行全面扫描。这对于 100k 行视图来说非常慢,我需要找到一种方法来避免这种情况。

对于一些简单的选择,Jet 似乎确实让 Oracle 完成了艰苦的工作并且不会加载所有行,因此我的问题 1。

如果这不起作用,我需要找到一种方法来强制 Jet 仅从 Oracle 加载我需要的给定请求的数据。

我知道我可以通过Access VBA修改pts,但我只能通过ODBC连接,所以我只能将SQL传递给Jet,不能调用vb api(除非可以在SQL语句中内联VB)。

4

2 回答 2

1

构造查询以导致表扫描并非不可能,这就是导致问题的原因。

您似乎正在使用 VBA。可以在 VBA 中将许多有趣的查询构造为 SQL 字符串并将它们保存到新查询、更新现有查询、将它们用作表单的记录源或打开记录集。您可以使用 DAO 或 ADO,具体取决于您想要做什么。我有 Oracle,所以我所能做的就是使用 SQL Server 提出想法,方括号中的连接可以通过查看链接表的连接 (CurrentDb.TableDefs("NameOfTable").Connect) 获得:

Dim cn As New ADODB.Connection

''You can use Microsoft.ACE.OLEDB.12.0 or Microsoft.Jet.OLEDB.4.0
scn = "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=" _
    & CurrentProject.FullName
cn.Open scn

''An insert query, but you can see that is would be easy enough to 
''select from two different databases
s = "INSERT into [ODBC;Description=TEST;DRIVER=SQL Server;" _
& "SERVER=ServerName\SQLEXPRESS;Trusted_Connection=Yes;" _
& "DATABASE=test].Table2 (id, atext) select id, atext from table1"

cn.Execute s

或者

''http://www.carlprothman.net/Default.aspx?tabid=87
strConnect = _
    "Provider=sqloledb;" & _
    "Data Source=myServerName;" & _
    "Initial Catalog=Test;" & _
    "Integrated Security=SSPI"
With cmd
    .ActiveConnection = strConnect
    .CommandType = adCmdText
    .CommandText = "SELECT ID, aText FROM table2 " _
                 & "WHERE ID=?"
    .Parameters.Append .CreateParameter _
        ("ID", adInteger, adParamInput, , 1)
    .CommandTimeout = 0
    Set rs = .Execute
End With
于 2010-08-04T11:54:53.770 回答
0

您可以在自己的数据库中复制 PT 查询,而不是在另一个数据库中链接到它吗?

PT 查询中的所有 sql 都应该在链接服务器上执行,而不需要 Jet 尝试解析或执行它。从 Jet 的角度来看,这是一门外语。

我将在 PT 中使用这样的代码:

SELECT * FROM DHSVIEWS.ClaimHeaderV    WHERE
DHSViews.claimheaderV.ClaimType = 'p'    AND
DHSViews.claimheaderV.FinalVersionInd = 'y'    AND
DHSViews.claimheaderV.ReimbursementAmount > 0    AND
DHSViews.claimheaderV.majorProgram = 'HH'    AND
DHSViews.claimheaderV.ServiceDateFrom >= [qStart]    AND
DHSViews.claimheaderV.ServiceDateFrom <=  [qEnd];

这在VBA中:

Set qdef = db.QueryDefs(qryPT)
sqlOld = qdef.sql
iPosStart = InStr(sqlOld, "[")
sqlNew = sqlOld
Do While iPosStart > 0
    iPosEnd = InStr(iPosStart, sqlNew, "]")
    param = Mid(sqlNew, iPosStart + 1, iPosEnd - iPosStart - 1)
    Select Case param
        Case "qStart"
            paramVal = "'" & rsQuarter("quarterStart") & "'"
        Case "qEnd"
            paramVal = "'" & rsQuarter("quarterEnd") & "'"
    End Select
    sqlNew = Mid(sqlNew, 1, iPosStart - 1) & paramVal & Mid(sqlNew, iPosEnd + 1)
    iPosStart = InStr(iPosEnd, sqlNew, "[")
Loop
If sqlNew <> sqlOld Then
    qdef.sql = sqlNew
End If
db.QueryDefs(rsPTAppend("append")).Execute
If sqlNew <> sqlOld Then
    qdef.sql = sqlOld
End If
于 2010-08-04T17:10:22.620 回答