• ベストアンサー

ADOのRecordCountプロパティについて

ADOを介してOracleにアクセスしています。 以前にAccessで行っていた時は、 Set rst.Open "Table_Main", cnn, adOpenStatic With rst lCount = .RecordCount End With とすればレコード数が返ってきたのですが、 Oracleの場合は-1のままなのです。 レコードセットの開き方に問題があるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
noname#4564
noname#4564
回答No.2

> COUNT(*)を使う場合は > Dim lCount as Long > strSQL = "select count (*) from Table_Main" > lCount = cnn.Execute (strSQL) > でいいのでしょうか。 実際に試して見ましたか? やってみれば、上記では正しくないことはすぐにわかるはずです。 Connection.ExecuteメソッドはRecordsetオブジェクトを返します。 (オブジェクトブラウザやヘルプで確認できます) 正しくは、(一例ですが)下記のようになります。 Dim adoCnn As ADODB.Connection Dim adoRst As ADODB.Recordset Dim lCount As Long Dim strSQL As String strSQL = "SELECT COUNT (*) FROM Table_Main" Set adoCnn = New ADODB.Connection Set adoRst = New ADODB.Recordset adoCnn.Open adoRst.Open strSql, adoCnn lCount = adoRst.Fields(0).Value ※ 省略可能な引数は省略して書いています。実際に使用する場合は適宜変更してください。 なお、通常は、adoRst.Fields(0).Value のように列番号による参照ではなく、adoRst.Fields("Name").Value のように列名による参照が一般的です。 この場合は、SQLの結果セットが1列しかないことと、COUNT (*) にエイリアス を付けていないため、このような記述にしています。 strSQL = "SELECT COUNT (*) As RecCount FROM Table_Main"  : (略)  : lCount = adoRst.Fields("RecCount").Value のように、列名を付与して記述することもできます。 (コードの可読性の観点ではこの方が無難です。ただし、エイリアスと予約語がぶつからないように注意!) 失礼ですが、SQLやDBの基本的な操作を書籍等で研究された方がよいと思います。

orion6619
質問者

お礼

どうもありがとうございました。参考になりました。

その他の回答 (1)

noname#4564
noname#4564
回答No.1

SELECT COUNT(*) ...... でレコード件数を取得できますが、これではダメですか?

orion6619
質問者

補足

COUNT(*)を使う場合は Dim lCount as Long strSQL = "select count (*) from Table_Main" lCount = cnn.Execute (strSQL) でいいのでしょうか。

関連するQ&A