2010-08-04 61 views
1

我通過ODBC連接到Jet 4數據庫。 Jet DB使用傳遞查詢到Oracle數據庫。這到目前爲止是有效的(不能直接訪問p-t查詢,但在查詢上創建一個視圖可以做到這一點)。Jet數據庫和傳遞查詢,參數

我需要由p-ts返回的數據的一些子集。參數最好,但不支持。

兩個問題:

1)噴氣似乎是能夠在那裏的一些從句推到Oracle。例如,我有一個返回100k行的傳遞查詢。一個關於帶有一個單獨的flitering子句(例如「district ='1010'」)的p-t的視圖非常快,所以處理似乎發生在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行的視圖來說,這是無法緩慢的,我需要找到一種避免這種情況的方法。

對於一些簡單的選擇,李連杰似乎確實讓Oracle做的辛勤工作和不加載的所有行,所以我的問題1.

如果不工作,我需要找到一種方法強制Jet僅爲給定請求加載Oracle需要的數據。我知道我可以通過Access VBA修改pts,但是我只通過ODBC連接,所以我只能將SQL傳遞給Jet,不能調用vb api(除非可能在SQL語句中內聯VB)。

+0

爲什麼是必要的噴氣機,如果你要查詢的Oracle?爲什麼不使用ODBC和ADO http://www.connectionstrings.com/oracle? – Fionnuala 2010-08-04 09:58:20

+0

一如既往,業務策略......我無法在Oracle數據倉庫上創建表或上傳任意數據。我正在使用Oracle數據庫中的數據加入當前存儲在Access/Jet中的一些自定義數據。 – Martin 2010-08-04 10:52:51

+0

Jet傳遞給服務器數據庫的內容將取決於涉及的服務器數據庫以及寫入ODBC驅動程序的程度。 Jet會盡可能多地請求元數據,以優化查詢並儘可能多地發送到服務器進行處理。我會看看你的SQL跟蹤,看看是什麼導致了更多的標準放緩。我會注意到,當我查看SQL Server中的蹤跡時,來自Jet with criteria的簡單查詢將使用通用參數化的sproc執行。我期望在Oracle中有類似的東西。 – 2010-08-04 18:14:26

回答

1

查詢構造成引起表掃描並不是不可能的,並且這導致了問題。

你似乎在VBA工作。有可能構建一些有趣的查詢,如VBA中的SQL字符串,並將它們保存到新查詢中,更新現有查詢,將它們用於表單的記錄源或打開記錄集。您可以使用DAO或ADO,具體取決於您想要執行的操作。我有Oracle,所以我所能做的只是建議使用SQL Server的想法,通過查看鏈接表(CurrentDb.TableDefs(「NameOfTable」))的連接可以獲得方括號中的連接。連接):

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 
+0

我不確定我是否理解你在這裏做什麼。這是否意味着您可以通過包含連接字符串在Jet SQL查詢中以內聯方式打開與其他數據庫的任意連接?如果是這種情況,我是否也可以內嵌傳遞查詢? – Martin 2010-08-04 13:46:42

+0

是的,你可以。答案有點徘徊,因爲我不確定你想做什麼,例如,我不確定你想要傳遞查詢發生什麼,或者你爲什麼需要它。 – Fionnuala 2010-08-04 14:29:16

+0

如果您在傳遞中內聯傳遞連接字符串,它將由遠程服務器處理。這可能會或可能不會工作。 – 2010-08-04 18:11:08

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