ODBC経由のデータベース参照

解決


ハイライト  2008-02-25 20:07:11  No: 100349  IP: 192.*.*.*

【開発環境】
Windows XP Pro SP3 / Visual Basic 6.0 SP6

上記の環境で、システムDSNに設定したODBC経由でデータベースの操作を行っております。

以下のコードで接続をしています。

Dim objCon As ADODB.Connection
Dim objRst As ADODB.Recordset
Dim strSQL As String
Dim lngRows As Long

    Set objCon = New ADODB.Connection
    objCon.Open "Provider・・・"

    Set objRst = CreateObject("ADODB.Recordset")
    strSQL = "SELECT COUNT(*) FROM usr_tbl"
    objRst.Open strSQL, objCon
    lngRows = objRst(0)

    strSQL = "SELECT usr_id,usr_pwd FROM usr_tbl"
    strWhere = " WHERE usr_id LIKE 'a'"
    objRst.Open strSQL & strWhere, objCon

    とすると

    実行時エラー 3021
    「BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。」

    とエラーを受けます。

    ところが、strWhereを含めずに実行した場合、つまり「objRst.Open "SELECT usr_id,usr_pwd FROM usr_tbl", objCon」と実行するとエラーは出ません。

    エラーの場合、正常の場合ともに、lngRows(レコード件数)は取得できています。

    原因が分からずにいます。ご教授ください。

編集 削除
もげ  2008-02-26 09:33:53  No: 100350  IP: 192.*.*.*

×教授
○教示

エラーの意味としては、
要するに該当するデータが無かったと。

コードの意図が読めないので、適宜補足くだされば幸いです。

>    strSQL = "SELECT COUNT(*) FROM usr_tbl"
>    objRst.Open strSQL, objCon
>    lngRows = objRst(0)

ここでテーブル全体の件数を取得されています。

>    エラーの場合、正常の場合ともに、lngRows(レコード件数)は取得できています。

というのは、ここの条件を変えない限り、
strWhereの有り無しに関係なく、
常に全体の件数が入っているものと推測します。


>    strSQL = "SELECT usr_id,usr_pwd FROM usr_tbl"
>    strWhere = " WHERE usr_id LIKE 'a'"
>    objRst.Open strSQL & strWhere, objCon

ここでは、選択条件で、
usr_id   が a のもの
を検索されていますね。
WHERE usr_id LIKE 'a'
WHERE usr_id = 'a'
と同じ意味になります。


Likeを使う意図としては、
usr_idの先頭   が a のもの

>    strWhere = " WHERE usr_id LIKE 'a%'"

としたかったのでしょうか?

>    ところが、strWhereを含めずに実行した場合、

条件を除いてしまえば全件が取得されますので、
テーブルが空でない限りは、当該エラーは出ないかと。

編集 削除
ハイライト  2008-02-26 18:27:33  No: 100351  IP: 192.*.*.*

原因が分かりました。

まず、

    Set objRst = CreateObject("ADODB.Recordset")
    strSQL = "SELECT COUNT(*) FROM usr_tbl"

としてusr_tble上のレコード件数をカウントします。

次に、WHERE句を付加して条件付レコードを検索しするのですが、その際の構文が

    WHERE A = 'a',B = 'b',C = 'c'

としており、実際には

    WHERE A = 'a' AND B = 'b' AND C = 'c'

が正しい構文でした。このためのエラーだったようです。

編集 削除