【開発環境】
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(レコード件数)は取得できています。
原因が分からずにいます。ご教授ください。
×教授
○教示
エラーの意味としては、
要するに該当するデータが無かったと。
コードの意図が読めないので、適宜補足くだされば幸いです。
> 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を含めずに実行した場合、
条件を除いてしまえば全件が取得されますので、
テーブルが空でない限りは、当該エラーは出ないかと。
原因が分かりました。
まず、
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'
が正しい構文でした。このためのエラーだったようです。