OLE DB Provider for Jet 4.0 または Office 12.0 Access Database Engine OLE DB Provider を使用時にサブ クエリを持つパラメータ クエリを実行すると、予期しない結果を返す場合がある

適用対象: Access 2010Microsoft Office Access 2007Microsoft Office Access 2003

現象


Microsoft OLE DB Provider for Jet 4.0 または Microsoft Office 12.0 Access Database Engine OLE DB Provider を使用時に、サブ クエリを持つパラメータ クエリを実行すると、レコード値が返されない、または誤ったレコード値が返されるなどの予期しない結果となる場合があります。

原因


この現象は、Microsoft Jet 4.0 データベース エンジン および Microsoft ACE データベース エンジンの問題により発生します。

回避策


この現象を回避するには、以下のいずれかの方法を実行してください。
  • OLE DB Provider for Jet 4.0 および Office 12.0 Access Database Engine OLE DB Provider を使用する代わりに、Microsoft Open Database Connectivity (以下 ODBC) Driver for Access を使用してください。

    注 : ODBC Driver for Access を使用した際に発生していたこの問題は、Microsoft Jet 4.0 データベース エンジン Service Pack 4 にて修正しました。詳細については、次の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。

    244719 [ODBC] Access ODBC ドライバ使用時に、パラメータがサブ クエリと一致しない
  • パラメータ ステートメントを使用しパラメータを明示的に設定してください。

    Sub ParameterMisMatchDemo()
    Dim conn As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim rs As ADODB.Recordset
    Dim strSQL As String

    ' このテストは、C:\ フォルダにある Microsoft Access のサンプル データベース
    ' NorthWind.mdb のコピーを必要とします。
    conn.Open "Provider=Microsoft.ACE.oledb.12.0;Data Source=C:\Northwind.mdb;"

    ' パラメータステートメントを使用しパラメータを設定します。
    'strSQL = "Select 得意先コード From 得意先 " & _
    "Where 都道府県 =? And 得意先コード In " & _
    "(Select 得意先コード From 受注 Where 受注コード =?)"

        strSQL = "PARAMETERS p1 Text,p2 Long; Select 得意先コード From 得意先 " & _
    "Where 都道府県 = p1 And 得意先コード In " & _
    "(Select 得意先コード From 受注 Where 受注コード = p2)"

    cmd.ActiveConnection = conn
    cmd.CommandText = strSQL
    cmd.CommandType = adCmdText

    ' 手動で、"左から右" という通常の順番でパラメータを追加します。
    cmd.Parameters.Append cmd.CreateParameter("都道府県", _
    adVarChar, adParamInput, 15)
    cmd.Parameters.Append cmd.CreateParameter("受注コード", _
    adInteger, adParamInput)

    ' パラメータを設定します。これらの値は結果セットから "37" の得意先コード
    ' を持つ 1 つのレコードを選択する必要があります。
    cmd.Parameters("都道府県").Value = "東京都"
    cmd.Parameters("受注コード").Value = 3026
    Set rs = cmd.Execute

    ' これは得意先コード "37" を返されます。

    MsgBox rs.Fields("得意先コード").Value

    End Sub
パラメータ ステートメントを作成する方法については、次の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
142938 Data Access Objects を使用してパラメータ クエリの作成方法

状況


マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。