SQL Server CE のレコード セットからレコード数を取得するには、方法


概要


一般的な質問とソースのデータ アクセスの混乱のプログラミングは、「どうすればレコードの数ですか?」

SQL Server CE テーブルを順方向専用カーソルを開くし、次のコードを使用してレコード数を取得しようとしています、ADOCE はレコードの数として-1 を返します。

rs.Open "SELECT * FROM mytable", cn, adOpenForwardOnly,
adLockReadOnly

詳細


これは仕様による動作です。高速にするためには機能の少ない順方向専用カーソルです。以下は、レコード数を取得する方法についていくつかの重要なポイントです。

  • レコード数を取得する機能は、カーソルの種類によって異なります。一部のカーソルは、「安価な」非常に高速やほとんどのメモリを使用しますします。他のカーソルより多くのメモリを低速または使用には後方スクロールまたはレコードの数を取得する機能など、多くの機能も用意されていますが、します。
  • SQL Server CE を順方向専用のクエリ結果カーソルは、レコード カウントの取得をサポートしていません。それはない行の数は、クエリから返される事前計算します。ADO は、レコード数を取得するために使用されるインターフェイスを取得できませんので、-1 を返します。
  • スクロール可能なクエリ カーソルは、カーソルの正確なレコード数を返すことができるの唯一の種類です。これらのカーソルより高価な (メモリのほとんどの場合)。レコード数を取得すると、負荷の高い操作ができる場合があります。
  • シナリオによって、テーブルから count(*) を選択します。 ..] のフェッチを開始する前にレコードの数を取得するにはできる場合があります。

順方向専用カーソル

SQL Server ce では、順方向専用カーソルは、レコードの数が返されるかを判断できません。最高速を提供するに最小限のメモリを消費するカーソル クエリ プロセッサが実際に返す行、それにします。ありませんバッファリング手順行の数が事前に決定されています。


SQL Server ce では、スクロール可能なクエリ カーソルは、フェッチされる一方で、行をバッファーします。ユーザーは、行の数を要求している場合は、棚卸を行うことができるように、行バッファリングされます。結果セットを後方スクロールすることができますため、ただし、行うことが、カウントのバッファリングされた、後の行の値を再読み込み。


ベース テーブル、前方のみを使用する方法、および ADOCE および eVB を使用してレコード セットを開くにスクロール可能なカーソルを次に示します。スクロール可能なカーソルのみが、正確なレコード数を与えます。


: SQL Server CE 2.0 をサンプル コードを操作するのには、元の接続文字列を変更する必要があります

"Provider=microsoft.sqlserver.oledb.ce.1.0;Data Source=\ssce.sdf"
宛先:

"Provider=microsoft.sqlserver.oledb.ce.2.0;Data Source=\ssce.sdf"

Dim cn As ADOCE.Connection
Dim rs1 As ADOCE.Recordset
Dim rs2 As ADOCE.Recordset
Dim rs3 As ADOCE.Recordset
Dim catalog

Private Sub Form_Load()

Dim str1 As String
Dim str2 As String
Dim str3 As String
Set cn = CreateObject("ADOCE.Connection.3.1")
Const strConnect = "Provider=microsoft.sqlserver.oledb.ce.1.0;Data Source=\ssce.sdf"


cn.Open strConnect

cn.Execute "Create table mytable (col1 int NOT NULL)"
cn.Execute "CREATE UNIQUE INDEX idx1 ON mytable(col1)"
cn.Execute "insert mytable values (70)"
cn.Execute "insert mytable values (71)"

' For Base table cursor, just supply table name as source, DO NOT WRITE A SELECT * statement.
' Should use adOpenDynamic and adLockOptimistic with adCmdTableDirect flag.

Set rs1 = CreateObject("ADOCE.Recordset.3.1")
rs1.Open "mytable", cn, adOpenDynamic, adLockOptimistic, adCmdTableDirect

str1 = rs1.RecordCount
rs1.Close
MsgBox "Record count: " & str1

' Forward-only cursor does not support record count.
' Forward-only cursors should use adOpenForwardOnly and adLockOptimistic.
' The adCmdTableDirect flag should not be used.

Set rs2 = CreateObject("ADOCE.Recordset.3.1")
rs2.Open "Select * from mytable", cn, adOpenForwardOnly, adLockOptimistic
str2 = rs2.RecordCount
rs2.Close
MsgBox "Record count: " & str2

' Scrollable cursors can use either adOpenStatic or adOpenKeyset.
' These cursors should use adLockReadOnly and not specify the adCmdTableDirect flag.
Set rs3 = CreateObject("ADOCE.Recordset.3.1")
rs3.Open "Select * from mytable", cn, adOpenStatic, adLockReadOnly
str3 = rs3.RecordCount
rs3.Close
MsgBox "Record count: " & str3

cn.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set rs3 = Nothing
Set cn = Nothing

End Sub