Jet数据库和传递查询,参数

时间:2010-08-04 07:53:04

标签: oracle ms-access vba odbc jet

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

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

两个问题:

1)Jet似乎能够将一些where-clause推送到Oracle。例如,我有一个返回100k行的passthrough查询。带有单个掠过子句的p-t视图(例如“district ='1010'”)非常快,因此处理似乎发生在Oracle上。添加更多子句可以将查询减慢到爬行速度,在CPU利用率较高的情况下循环几分钟。是否有任何关于Jet方面传递内容和做什么的文档?

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

由于 马丁

修改 很抱歉这么不清楚。

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

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

对于一些简单选择,Jet似乎让Oracle做了大量工作并且没有加载所有行,因此我的问题为1。

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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