SQLでCOUNT関数について

解決


こわし  2007-03-11 04:06:49  No: 135719

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の方になってしまいます。どこが悪いのでしょうか。誰か教えてください。


モーヲタ  2007-03-11 08:27:26  No: 135720

>と書いていて実行したらみんな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の変数名は止めましょう。紛らわしいです。
# レコードセットオブジェクトに思えます。


モーヲタ  2007-03-11 08:46:57  No: 135721

ふと考えたらADOrs.RecordCount > 0がまずいのではないですか?
select count * from 社員リスト where 出身者='沖縄'
を実行するとレコードがあろうがなかろうがcountの件数として
常に1レコードとして取得するように思えますが・・・。
# 確認する環境はありますがめんどくさいのでしてません。


ささき  2007-03-12 19:03:13  No: 135722

>常に1レコードとして取得するように思えますが・・・。

そうゆう結果を求めたいならば副問い合わせを
使っているはずではないかなぁ〜。
VBでなくSQLの問題なので詳細は割愛しますが。


こわし  2007-03-13 01:35:00  No: 135723

>モーヲタさん、ささきさん
すいません、わかりにくくて。もう一度すべて確認して変えてみてそれでもまたダメなようでしたらまたご質問します。返事ありがとうございます。


もげ  2007-03-13 02:15:49  No: 135724

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加