1

ODBC 経由で Jet 4 DB に接続しています。Jet DB は、Oracle DB へのパススルー クエリを使用します。これはこれまでのところ機能しています (pt クエリに直接アクセスすることはできませんが、クエリでビューを作成するとうまくいきます)。

p-ts によって返されたデータのサブセットが必要です。パラメータが最適ですが、サポートされていません。

2 つの質問:

1) Jet は、いくつかの where 句を Oracle にプッシュできるようです。たとえば、10 万行を返すパススルー クエリがあります。単一の flitering 句 (例: "district = '1010'") を持つ pt のビューは非常に高速であるため、処理は Oracle で行われるようです。句をさらに追加すると、CPU 使用率が高い状態で数分間ループし、クロールまでクエリが遅くなる可能性があります。Jet 側で何が渡され、何が行われるかについてのドキュメントはありますか?

2) VBA/Access を使用して動的パススルー クエリを作成する方法に関するチュートリアルが多数あります。ODBC 経由でアクセスする Jet を使用して、これを行うこと (またはそのようなことを行うこと) は可能ですか?

ありがとうマーティン

編集: 不明瞭で申し訳ありません。

ODBC 経由で Jet データベースにアクセスするレポート ツールがあります。Jet データベースには、いくつかのデータと Oracle データベースへのいくつかのパススルー クエリが含まれています。典型的な使用例は、Jet と Oracle からのデータを使用して、特定の部門と特定の日付のレポートを生成することです。これは原則として非常にうまく機能します。

問題は、パススルー クエリにパラメーターを含めることができないことです。パススルー クエリはビューのように機能するため、「select * from pt_query where dep = 'a' and date = somedate」を実行するだけです。ただし、Jet は pt からすべての行を読み込み、クライアント側でフル スキャンを実行します。これは 10 万行のビューでは使用できないほど遅く、それを回避する方法を見つける必要があります。

いくつかの単純な選択では、Jet は Oracle に大変な作業をさせているようで、すべての行をロードしないため、私の質問 1.

それがうまくいかない場合は、Jet が特定の要求に対して Oracle から必要なデータのみをロードするように強制する方法を見つける必要があります。

Access VBA を介してポイントを変更できることはわかっていますが、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 が解析または実行を試みることなく、リンク サーバー上で実行される必要があります。ジェット視点の外国語です。

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 に答える