SQLでCOUNT関数で出た結果を識別するのはどのようにしたらいいのでしょうか?
Dim RE AS Long
RE = SQLExecute("select count * from 社員リスト where 出身者='沖縄'")
If ADOrs.EOF = True Or ADOrs.RecordCount > 0 Then
flag = 1
MsgBox "0人です"
Else
flag = 0
MsgBox "HITしました"
End If
と書いていて実行したらみんなFlag1の方になってしまいます。どこが悪いのでしょうか。誰か教えてください。
>と書いていて実行したらみんなFlag1の方になってしまいます。どこが悪いのでしょうか。誰か教えてください。
ツッコミどころ満載ですがまずは、
1:開発環境は何ですか?
2:データベースは何ですか?
3:データベースに接続されていることは確認済みですか?
4:select count * from 社員リスト where 出身者='沖縄'
のSQL文ですが、countって括弧が入りませんでしたっけ?
確認してないから分かりませんが。
5:実際に社員リストテーブルに出身者が沖縄のデータが
存在している事は確認済みですか?
6:SQLExecute関数は自作関数ですか?
戻り値にLONG値を取っているようですが何の戻り値ですか?
で、次のIF文でいきなりADOrsと言う意味不明のオブジェクト
(名前からADOのレコードセットオブジェクトと想像できますが・・・)
のプロパティの判定を行ってますよね?
このADOrsはいつどこでセットされるのですか?
SQLExecute関数内ですか?こちらは提示されたコードでしか
判断できないのでそれ以上は分かりません。
一つ言えることはADOrs.EOF = Trueになっているか、
ADOrs.RecordCount > 0になっているとしか言えないです。
と言うか、この判定の組み合わせは合っているのですか?
ADOrs.EOF = Trueの時かADOrs.RecordCount > 0の時ですよ?
言い換えるとレコードの末尾に達したときかレコード件数が
1以上の時ですよ?
もうちょっと第三者(回答者)の立場で質問し直してください。
質問内容が省略されすぎで分かりません。
# Dim RE As Longの変数名は止めましょう。紛らわしいです。
# レコードセットオブジェクトに思えます。
ふと考えたらADOrs.RecordCount > 0がまずいのではないですか?
select count * from 社員リスト where 出身者='沖縄'
を実行するとレコードがあろうがなかろうがcountの件数として
常に1レコードとして取得するように思えますが・・・。
# 確認する環境はありますがめんどくさいのでしてません。
>常に1レコードとして取得するように思えますが・・・。
そうゆう結果を求めたいならば副問い合わせを
使っているはずではないかなぁ〜。
VBでなくSQLの問題なので詳細は割愛しますが。
>モーヲタさん、ささきさん
すいません、わかりにくくて。もう一度すべて確認して変えてみてそれでもまたダメなようでしたらまたご質問します。返事ありがとうございます。
SQLExecute()の仕様が謎ですが、
結果をRecordsetで返すSELECT文の実行と、
INSERT/UPDATE/DELETEのSQLの実行は、区別したほうがいいかもしれません。
ADOrsに値をセットしない限り、EOFプロパティ は 永遠にTrueですし、
RecordCountプロパティとSQL文のCOUNT()は連動しませんし、
SELECT COUNT(*) では、結果が何件でもレコードは1件返されますし、
RecordCountプロパティを使おうとすると、
CursorLocation、CursorTypeなども気にする必要があります。
まずはRecordsetの扱いかたについてヘルプ等を調べてみてください。
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strCon As String
Dim strSQL As String
strCon = "Provider=Microsoft.Jet.OLEDB.4.0; "
strCon = strCon & "Data Source = C:\aaa\bbb\data.mdb"
Set cn = New ADODB.Connection
cn.Open strCon
strSQL = "select * from 社員リスト where 出身者='沖縄'"
Set rs = New ADODB.Recordset
rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly
If rs.EOF =True Or rs.BOF = True Then
'無いときの処理
Else
'有るときの処理
End If
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
ツイート | ![]() |