3

PHPMS Access データベースと対話するために次のコードを実行しています。

$odbc_con = new COM("ADODB.Connection");
$constr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . $db_path . ";";
$odbc_con -> open($constr);

$rs_select = $odbc_con -> execute ("SELECT * FROM Main");

を使用($rs_select -> RecordCount)すると -1 が返されますが、クエリはゼロ以外のレコードを返します。

(a) その理由は何ですか? (b) 逃げ道はありますか?

も使ってみcount($rs_select -> GetRows())ました。これは必要性を満たしますが、最初にすべてのレコードを配列にコピーする必要があるため、非効率に見えます。

4

5 に答える 5

1

ADODB には、定義したレコードセットの種類に応じて返されるレコード数に関する独自の規則があります。見る:

MS ナレッジ ベースの記事 194973

W3C スクールの記事

上記の例では、PHP COM() オブジェクトを使用して、汎用データベース アクセス用の COM インターフェイスである ADODB をインスタンス化しています。PHP ドキュメントによると、生成されたオブジェクト参照はオーバーロードされているため、ネイティブ ADODB オブジェクトと同じプロパティ/メソッドを使用できます。これは、ADODB メソッドを使用して、正確なレコード数が得られるレコードセット タイプを設定する必要があることを意味します (必要な場合)。他の人が述べたように、別のクエリを使用して、SELECT ステートメントによって返されるレコードの COUNT() を取得することもできます。これは簡単ですが、特定の環境では不適切な場合があります。

私は ADO の達人ではないので、レコードセットの種類を設定するための正確なコマンドを提供することはできませんが、上記の記事から、静的カーソルまたはキーセット カーソルが必要であることは明らかです。CursorType を設定する適切な方法は、レコードセットを開くコマンドでパラメーターを使用することです。CursorType プロパティに関するこの W3C Schools の記事では、そのコマンドの適切な引数が示されています。

願わくば、この情報が元の投稿者が何らかの方法で彼の仕事を達成するのに役立つことを願っています.

于 2008-09-24T21:43:40.777 に答える
1

ODBC がまだレコード数を認識していない可能性があります。その場合、最後のレコードに移動して初めて、recordcount に実際のレコード数が反映されます。クエリからすべてのレコードをロードするため、これもおそらくあまり効率的ではありません。

Oli が言ったように、使用SELECT COUNT(*)すると結果が得られます。最初の方法を使用するよりも、2 つのクエリを使用する方が効率的だと思います。

于 2008-09-24T11:32:53.773 に答える
0

基本的に、Accessは、必要になるまでレコードセット全体を表示しません(とにかく、多くのユーザーエクスペリエンスでは、その方が高速です)。特に、レコードセットが大きい場合はそうです。

正確なカウントを取得するには、レコードセット全体をトラバースする必要があります。VBAでは、通常、foo.MoveLastとfoo.MoveFirstのデュオを使用してこれを行います-phpに相当するものが何であるかはわかりません。値段は高いですが、とにかくレコードセット全体を処理しているように聞こえるので、大丈夫だと思います。

(補足として、VBAでブックマークを操作している場合も、この同じトラバーサルが必要です。レコードセットのクローンを作成し、ブックマークをフォームのレコードセットにコピーして戻す前にトラバースしないと、ワイルドな結果が得られる可能性があるためです)

于 2008-09-24T18:21:29.047 に答える
0

Access には独自の COUNT 演算子がありませんか? 例えば:

$rs_select = $odbc_con -> execute ("SELECT COUNT(*) FROM Main");
于 2008-09-24T11:14:25.050 に答える
-1

動的カーソルタイプの接続を使用している場合は、実際に変更される可能性があります。レコードのページを閲覧しているときに、誰かがそのデータベースからレコードを削除する可能性があります。回避するには、静的な種類のスナップショットカーソルを使用します。私はそれをよく説明するこのブックマークを持っています。これはいつも私を魅了し、ブックマークはいつも私に理由を思い出させました。

http://support.microsoft.com/kb/194973

于 2008-09-25T16:26:10.923 に答える