我數據庫中的一個(gè)表中有2萬(wàn)多行數據
在使用MSHFlexGrid1進(jìn)行顯示時(shí),最多只能顯示1016行
我已經(jīng)安裝了SP6,SP5,但問(wèn)題依舊
附:后發(fā)現
sql="select * from xx"
能顯示2萬(wàn)多行全部數據
sql="SELECT a.a1,b.b2 FROM (a INNER JOIN b ON a.id = b.id) WHERE (((a.jsnd)=‘2005‘))"
時(shí)只能顯示1036行
當
sql="SELECT a.a1,b.b2,c.c3 FROM (a INNER JOIN b ON a.id = b.id) INNER JOIN tb_zgdwlx ON c.id =b.id WHERE (((a.jsnd)=‘2005‘))"
時(shí)就只能顯示1016行了
我將conn.ConnectionString修改為
conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=sj;Data Source=XW;Connect Timeout=30"
故障依舊
懷疑時(shí)SQL語(yǔ)句查詢(xún)太慢的問(wèn)題,改成 存儲過(guò)程后能給MSHFlexGrid1填充1032行,沒(méi)有太大改變
請大家幫助
終于發(fā)現了問(wèn)題
當使用
rec.CursorLocation = adUseClient
時(shí),能正確的返回全部數據
這是什么原因呢?對做了數年數據庫開(kāi)發(fā)的我也很迷惑
找了點(diǎn)材料
見(jiàn)下,
××××××××××××××××××××××××××8
1. 什幺是光標?
光標,也有人稱(chēng)為游標。概括的講,它是基于記錄的。
過(guò)去,關(guān)系型數據庫沒(méi)有象現在這樣被廣泛的應用。那時(shí)候,人們大多使用 dBase 這樣的小型數據庫軟件。這類(lèi)數據庫確切的說(shuō)應為數據文件管理軟件。他們是面向記錄的。
不過(guò),這種方式也許更符合人們的習慣。比如,我們在電話(huà)本中查找號碼,在學(xué)生檔案中查找檔案,最終都要歸結于其中的一個(gè)號碼,一個(gè)檔案,那就是一條記錄?,F實(shí)生活中,我們在一張表格中尋找某一項時(shí),可能會(huì )用手一條一條逐行的掃過(guò),以幫助我們找到所需的那條記錄。對應于數據庫來(lái)說(shuō),這就是光標的模型。所以,你可以這樣想象:表格是數據庫中的表,而我們的手好比是光標。
所以,當你使用類(lèi)似 .MoveNext,.MoveLast 這樣的語(yǔ)句時(shí),覺(jué)得再自然不過(guò)了。
現在,你明白什幺是光標了吧。光標就是數據的 ‘ 定位系統 ‘ 。
這個(gè) ‘ 定位系統 ‘ 粗分有兩種:服務(wù)器光標和客戶(hù)光標。對應于 ADO 中的 CursorLocation 。舉例來(lái)說(shuō):
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.CursorLocation = adUseServer ‘缺省,使用服務(wù)器光標
.....
rs.CursorLocation = adUseClient ‘使用客戶(hù)光標
2. 什幺是服務(wù)器光標?
或者稱(chēng)為 API 服務(wù)器光標。
假設你要查詢(xún)有關(guān)編程語(yǔ)言的書(shū),寫(xiě)成 SQL 語(yǔ)句就是:SELECT book_id,book_title FROM books WHERE book_catalog = ‘編程‘ ORDER BY book_title,同時(shí)你指定使用服務(wù)器光標。
這條語(yǔ)句發(fā)送到服務(wù)器,服務(wù)器對數據進(jìn)行檢索,將符合查詢(xún)條件的記錄集合放入臨時(shí)表(對某些光標類(lèi)型是這樣)中。每當你進(jìn)行 .MoveNext 操作,服務(wù)器就會(huì )發(fā)送一條記錄到客戶(hù)端的緩沖區,然后你才可以使用它。
3. 什幺是 CacheSize ?
繼續上面的例子,假設符合查詢(xún)條件的記錄有100個(gè),也就是說(shuō),用 .MoveNext 這種方法遍歷該結果集需要同服務(wù)器交互100次。我們可以通過(guò)設置 CacheSize 使客戶(hù)與服務(wù)器的通信變少。上面的例子其實(shí)就是 CacheSize=1 的情況,這是缺省值。
假設 CacheSize=4,當 RecordSet 對象打開(kāi)時(shí),服務(wù)器發(fā)送4條記錄到客戶(hù)端。前4次的 .MoveNext 操作實(shí)際上是在客戶(hù)緩沖區中得到數據,當第5次 .Movenext 時(shí),服務(wù)器才發(fā)送下一個(gè)4條記錄。由此,減少了客戶(hù)與服務(wù)器間的網(wǎng)絡(luò )通信。
那幺是不是說(shuō) CacheSize 越大越好呢?千萬(wàn)不要想當然。萬(wàn)事都有兩面性,CacheSize 也一樣??蛻?hù)端請求數據,服務(wù)器發(fā)送數據,這個(gè)過(guò)程有點(diǎn)象交通管理。CacheSize 過(guò)高,會(huì )阻塞交通,甚至引起數據丟失(比如當 Cachesize 大于客戶(hù)端緩沖區時(shí))。對于不同的應用,所取的值也不同。
另外要指出的是,使用任何形式的光標都不是最有效的訪(fǎng)問(wèn)數據的方法,Cachesize 有的時(shí)候并不是瓶頸,盡量將使用光標的程序轉換為面向結果集的程序,性能會(huì )提高很多。
3. 什幺是客戶(hù)光標?
既然光標是數據的 ‘ 定位系統 ‘,那幺在客戶(hù)端也可以完成。
客戶(hù)光標的產(chǎn)生由來(lái)已久,當初是為了彌補服務(wù)器的不足(有些數據庫引擎就不支持光標)。隨著(zhù)服務(wù)器光標的出現,客戶(hù)光標似乎已經(jīng)過(guò)時(shí)了,不過(guò)還是那句話(huà):萬(wàn)事都有兩面性,在 internet 上,與數據庫的連接并不是永久的,使用客戶(hù)光標能使我們獲得同使用服務(wù)器光標一樣的功能。
當 CursorLoction 屬性設成 adUseClient 時(shí),微軟的光標服務(wù)( Cursor Service )創(chuàng )建 RecordSet 對象,用前向 / 只讀的光標方式從服務(wù)器將所有查詢(xún)結果檢索出來(lái),并且存儲在客戶(hù)緩沖區中。當應用程序通過(guò) ADO 請求數據時(shí),光標服務(wù)就從客戶(hù)緩沖區中檢取數據。這種方式在連接遠程服務(wù)器時(shí)非常有用,它會(huì )提高應用程序的性能。如果你訪(fǎng)問(wèn)的數據庫是 Jet 數據庫( Access ),而且在本地,那么用客戶(hù)光標非但不提高性能,還會(huì )使性能下降。這時(shí)候,數據將被緩存兩次,數據庫一次,光標服務(wù)一次。
如果考慮應用的功能,客戶(hù)光標功能是很完善的,它能支持某些數據庫不能完成的操作( 視數據庫的情況而定 )。
4. 什幺是 DisConnected RecordSet ?
我們使用了客戶(hù)光標,就可以斷開(kāi)與數據庫的連接,釋放 Connection 對象。這樣的結果集就是 DisConnected RecordSet。舉例說(shuō)明:
Dim c As New ADODB.Connection
Dim r As New ADODB.Recordset
On Error GoTo handler
c.ConnectionString = connectStr
c.CursorLocation = adUseClient
c.Open
Set r.ActiveConnection = c
r.Open SqlText, , adOpenKeyset, adLockBatchOptimistic, -1
Set r.ActiveConnection = Nothing ‘ This disconnects the recordset.
c.Close
Set c = Nothing
......
......
‘ Recordset is now in disconnected state; do something with it.
r.Close
Set r = Nothing
......
聯(lián)系客服