DOBON.NET DOBON.NETプログラミング掲示板過去ログ

不一致クエリ内の選択クエリパラメータを設定したい

環境/言語:[Windows7,VB.NET]
分類:[.NET]

お世話になります。

入庫テーブル“tblInstock”の入庫日(inDate)と、出庫テーブル“tblOutstock”の
出庫日(outDate)が共に指定日よりも前のレコードでData01をキーに不一致レコードを取得しようとしています。

sqlString = "SELECT * FROM tblInStock LEFT JOIN qulOutStockSelect ON tblInStock.[Data01] = qulOutStockSelect.[Data01] " & _
"WHERE (qulOutStockSelect.Data01 Is Null) AND (tblInstock.inDate <= #" & strDate & "#);"

daInstockInconsis = New OdbcDataAdapter(sqlString, cnInoutstock)

cbInstockInconsis = New OdbcCommandBuilder(daInstockInconsis)

dtInstockInconsis = New Data.DataTable()

daInstockInconsis.Fill(dtInstockInconsis)


(qulOutstockSelectは“SELECT * FROM tblOutstock WHERE outDate <= [?];”です)


上記を実行するとパラメータ設定エラーが発生します。

どのようにすれば、SQL文で使用しているクエリ(qulOutstockSelect)にパラメータを設定することができるのでしょうか。

御教授宜しくお願い致します。









■No30108に返信(Yoshiさんの記事)
使用されているデータベースはAccessですか?
■No30109に返信(もりおさんの記事)
> ■No30108に返信(Yoshiさんの記事)
> 使用されているデータベースはAccessですか?

Accessデータベースを使用します。
2012/03/19(Mon) 06:22:18 編集(投稿者)

■No30110に返信(Yoshiさんの記事)
OleDbCommandを使用すると以下のような感じでクエリーのパラメータを設定することがで
きましたが、OdbcCommandを使用すると同じやり方でパラメータを設定することができま
せんでした。DAOではパラメータを設定することができました。ADOでは、OLEDBを使用す
るとパラメータを設定することができ、ODBCを使用するとパラメータを設定することがで
きませんでした。パラメータを設定できるかどうかはデータプロバイダーによって変わる
ようです。ODBCはクエリーのパラメータを設定することができない仕様なのか、クエリー
のパラメータを設定する特別な記述法があるのか、そのあたり私は明確に判断することが
できませんが、ODBCではクエリーのパラメータを設定することができない可能性が高いの
でないかしらというのが私の率直な感想でございます。

Dim daInstockInconsis As OleDbDataAdapter = New OleDbDataAdapter( _
    " SELECT " & _
    "     * " & _
    " FROM " & _
    "     tblInStock LEFT JOIN qulOutStockSelect " & _
    "     ON tblInStock.Data01 = qulOutStockSelect.Data01 " & _
    " WHERE " & _
    "     (qulOutStockSelect.Data01 Is Null) " & _
    "     AND " & _
    "     (tblInstock.inDate <= ?) ", _
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\a\Documents\test.accdb")
Dim params As OleDbParameterCollection = daInstockInconsis.SelectCommand.Parameters
params.Add(New OleDbParameter("outDate", OleDbType.Date, 0)).Value = New DateTime(2003, 3, 5)
params.Add(New OleDbParameter("inDate", OleDbType.Date, 0)).Value = New DateTime(2003, 3, 5)
Dim dtInstockInconsis As DataTable = New DataTable()
daInstockInconsis.Fill(dtInstockInconsis)
詳細な説明有難うございます。

今回の仕様ではODBC接続が必須となっているため、

Dim strDate as Stirng = "2012/03/20"

SELECT * INTO tblOutstockSelect FROM tblOutstock WHERE outDate <=#" & strDate & "#;"
にて仮テーブルtblOutstockSelectを作成してから

SELECT * FROM tblInStock LEFT JOIN tblOutStockSelect ON tblInStock.[Data01] = tblOutStockSelect.[Data01] " & _
"WHERE (tblOutStockSelect.Data01 Is Null) AND (tblInstock.inDate <= #" & strDate & "#);"

にて指定日以前のレコードに対して不一致レコード取得することにしました。

この方法ですと、毎回実行時にDropコマンドで前回作成テーブルを削除する必要が
ありますので不効率にはなりますが他に方法が思いつかなかったので・・・


今後とも宜しくお願い致します。
■No30121に返信(Yoshiさんの記事)
サブクエリを利用されてはいかがでしょうか。SQLがすこし複雑になりますがテーブルを作成せずにすみます。
SELECT
    *
FROM
    tblInStock i
    LEFT OUTER JOIN
    (
        SELECT
            *
        FROM
            tblOutStock
        WHERE
            outDate <= ?
    ) o
    ON i.Data01 = o.Data01
WHERE
    (i.inDate <= ?)
    AND
    (o.Data01 Is Null)

DOBON.NET | プログラミング道 | プログラミング掲示板