Jak uzyskać liczba rekordów z zestawu rekordów programu SQL Server CE


Streszczenie


Typowe pytania i źródło niezgodności w dostęp do danych programowania jest "Jak uzyskać liczba rekordów?"

Jeśli otworzyć tylko do przodu kursor na tabeli programu SQL Server CE i postaraj się, aby liczba rekordów przy użyciu następującego kodu ADOCE zwraca wartość -1 jako liczba rekordów:

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

Więcej informacji


To zachowanie jest zgodne z projektem. W celu szybkiego, istnieje mniej funkcji w kursor progresywny. Poniżej przedstawiono kilka ważnych kwestii, w jaki sposób uzyskać liczba rekordów:

  • Możliwość uzyskania liczba rekordów jest zależna od typu kursora. Niektóre kursory są bardzo "tani", w tym one są szybkie i/lub użyć mała ilość pamięci. Inne kursory są wolniejsze/używać większej ilości pamięci, ale również umożliwia udostępnienie dodatkowych funkcji, takich jak możliwość przewinąć do tyłu lub uzyskać liczby rekordów.
  • Kursor progresywny kwerendę wynik przeciwko SQL Server CE nie obsługuje pobierania liczby rekordów. Nie wcześniej obliczyć, ile wierszy zostaną zwrócone przez kwerendę. Obiekty ADO zwraca wartość -1, ponieważ nie można uzyskać interfejsu, który jest używany do uzyskania liczby rekordów.
  • Kwerenda przewijalna kursory są jedynym rodzajem kursorów, które może zwracać dokładne liczbę rekordów. Kursory te są droższe (w pamięci, głównie). Liczba rekordów może być kosztowna operacja.
  • W zależności od scenariusza można zrobić " select count(*) z tabeli ...", aby uzyskać liczby rekordów, przed rozpoczęciem pobierania.

Kursory progresywne

Kursory progresywne w programie SQL Server CE nie może określić, ile rekordów są ma być zwrócony. Aby zapewnić najszybszy, co najmniej dużej ilości pamięci kursora, procesor kwerend jest rzeczywiście daje powrót wierszy, jak to określa. Nie jest kroku buforowania nie gdzie jest wstępnie określoną liczbę wierszy.


Kwerenda przewijalna kursory w programie SQL Server CE bufora wierszy z drugiej strony, jak są one pobierane. Jeśli użytkownik zażąda liczba wierszy, wiersze są buforowane, tak, że może być traktowane. Ponieważ można przewijać do tyłu w zestawie wyników, jednak użytkownik może następnie ponownie odczytać wartości wierszy po były buforowane do zliczania.


Poniższy kod ilustruje sposób użycia tabeli bazowej tylko przesyłanie dalej i kursory przewijaną otworzyć zestawy rekordów przy użyciu ADOCE i eVB. Tylko kursory przewijaną podać liczbę rekordów dokładne:


Uwaga: dla programu SQL Server CE 2.0 do pracy z przykładowego kodu, należy zmienić ciąg połączenia z

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

"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