####真正的程序员请进##如何用MSHFlexGrid1来显示多表万行数据×××××××××××××××续2×××

cjlong 2005-08-05 10:00:06
前贴已结,,,见http://community.csdn.net/Expert/TopicView3.asp?id=4187850


我数据库中的一个表中有2万多行数据

在使用MSHFlexGrid1进行显示时,最多只能显示1016行

我已经安装了SP6,SP5,但问题依旧

附:后发现

sql="select * from xx"

能显示2万多行全部数据

sql="SELECT a.a1,b.b2 FROM (a INNER JOIN b ON a.id = b.id) WHERE (((a.jsnd)='2005'))"
时只能显示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'))"
时就只能显示1016行了

我将conn.ConnectionString修改为
conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=sj;Data Source=XW;Connect Timeout=30"

故障依旧

怀疑时SQL语句查询太慢的问题,改成 存储过程后能给MSHFlexGrid1填充1032行,没有太大改变

请大家帮助
...全文
300 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjlong 2005-08-08
  • 打赏
  • 举报
回复
终于发现了问题
当使用
rec.CursorLocation = adUseClient
时,能正确的返回全部数据

这是什么原因呢?对做了数年数据库开发的我也很迷惑

找了点材料

见下,
××××××××××××××××××××××××××8
  1. 什幺是光标?

光标,也有人称为游标。概括的讲,它是基于记录的。

过去,关系型数据库没有象现在这样被广泛的应用。那时候,人们大多使用 dBase 这样的小型数据库软件。这类数据库确切的说应为数据文件管理软件。他们是面向记录的。

不过,这种方式也许更符合人们的习惯。比如,我们在电话本中查找号码,在学生档案中查找档案,最终都要归结于其中的一个号码,一个档案,那就是一条记录。现实生活中,我们在一张表格中寻找某一项时,可能会用手一条一条逐行的扫过,以帮助我们找到所需的那条记录。对应于数据库来说,这就是光标的模型。所以,你可以这样想象:表格是数据库中的表,而我们的手好比是光标。

所以,当你使用类似 .MoveNext,.MoveLast 这样的语句时,觉得再自然不过了。

现在,你明白什幺是光标了吧。光标就是数据的 ' 定位系统 ' 。

这个 ' 定位系统 ' 粗分有两种:服务器光标和客户光标。对应于 ADO 中的 CursorLocation 。举例来说:

Set rs = Server.CreateObject("ADODB.RecordSet")
rs.CursorLocation = adUseServer '缺省,使用服务器光标
.....
rs.CursorLocation = adUseClient '使用客户光标

2. 什幺是服务器光标?

或者称为 API 服务器光标。

假设你要查询有关编程语言的书,写成 SQL 语句就是:SELECT book_id,book_title FROM books WHERE book_catalog = '编程' ORDER BY book_title,同时你指定使用服务器光标。

这条语句发送到服务器,服务器对数据进行检索,将符合查询条件的记录集合放入临时表(对某些光标类型是这样)中。每当你进行 .MoveNext 操作,服务器就会发送一条记录到客户端的缓冲区,然后你才可以使用它。

3. 什幺是 CacheSize ?

继续上面的例子,假设符合查询条件的记录有100个,也就是说,用 .MoveNext 这种方法遍历该结果集需要同服务器交互100次。我们可以通过设置 CacheSize 使客户与服务器的通信变少。上面的例子其实就是 CacheSize=1 的情况,这是缺省值。

假设 CacheSize=4,当 RecordSet 对象打开时,服务器发送4条记录到客户端。前4次的 .MoveNext 操作实际上是在客户缓冲区中得到数据,当第5次 .Movenext 时,服务器才发送下一个4条记录。由此,减少了客户与服务器间的网络通信。

那幺是不是说 CacheSize 越大越好呢?千万不要想当然。万事都有两面性,CacheSize 也一样。客户端请求数据,服务器发送数据,这个过程有点象交通管理。CacheSize 过高,会阻塞交通,甚至引起数据丢失(比如当 Cachesize 大于客户端缓冲区时)。对于不同的应用,所取的值也不同。

另外要指出的是,使用任何形式的光标都不是最有效的访问数据的方法,Cachesize 有的时候并不是瓶颈,尽量将使用光标的程序转换为面向结果集的程序,性能会提高很多。

3. 什幺是客户光标?

既然光标是数据的 ' 定位系统 ',那幺在客户端也可以完成。

客户光标的产生由来已久,当初是为了弥补服务器的不足(有些数据库引擎就不支持光标)。随着服务器光标的出现,客户光标似乎已经过时了,不过还是那句话:万事都有两面性,在 internet 上,与数据库的连接并不是永久的,使用客户光标能使我们获得同使用服务器光标一样的功能。

当 CursorLoction 属性设成 adUseClient 时,微软的光标服务( Cursor Service )创建 RecordSet 对象,用前向 / 只读的光标方式从服务器将所有查询结果检索出来,并且存储在客户缓冲区中。当应用程序通过 ADO 请求数据时,光标服务就从客户缓冲区中检取数据。这种方式在连接远程服务器时非常有用,它会提高应用程序的性能。如果你访问的数据库是 Jet 数据库( Access ),而且在本地,那么用客户光标非但不提高性能,还会使性能下降。这时候,数据将被缓存两次,数据库一次,光标服务一次。

如果考虑应用的功能,客户光标功能是很完善的,它能支持某些数据库不能完成的操作( 视数据库的情况而定 )。

4. 什幺是 DisConnected RecordSet ?

我们使用了客户光标,就可以断开与数据库的连接,释放 Connection 对象。这样的结果集就是 DisConnected RecordSet。举例说明:

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
......
aohan 2005-08-06
  • 打赏
  • 举报
回复
如果SP4不打也应该能显示2048条记录的
脆皮大雪糕 2005-08-06
  • 打赏
  • 举报
回复
1、在查询分析器确定你的查询是否真的有返回那么多行数据
2、执行完查询语句以后立即检查recordset的RecordCount到底是多少行
3、如果前面两点检查都是正确的,而填充到grid中的时候只有一千多行那么检查你的VB是否打过sp5,MSHGrid的bug导致了绑定数据集的时候数据不完整,如果你的部件引用不是"Microsoft Hierarchical FlexGrid Control 6.0 (SP4) (OLEDB)"那么赶快去打补丁。SP5如果找不到可以和我QQ联系71429660

dt168 2005-08-06
  • 打赏
  • 举报
回复
不是记录多少了,而是看占多大的内存空间吧
myhelp_110 2005-08-06
  • 打赏
  • 举报
回复
想问楼主,显示这么多行有实际意义吗?谁会一行一行的去找呀?换个思路,建议。
sqfeiyu 2005-08-05
  • 打赏
  • 举报
回复
看看你的MSHFlexGrid1.datesouse.RecordCount是多少?
cjlong 2005-08-05
  • 打赏
  • 举报
回复
上面说到了

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'))"

在SQL 查询器里执行时是可以正常返回19000多条数据的

××××××××××××××××××××××××
Connect Timeout=0

我也试过了,我不知道
aohan 2005-08-05
  • 打赏
  • 举报
回复
查询分析器中执行

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'))"

能返回多少行?

要看看你自己的条件规定是否正确,如果觉得连接时间有问题,可以将连接时间设置成为0,让其一直不过期
cjlong 2005-08-05
  • 打赏
  • 举报
回复
to zyg0(影子(成功减肥10斤,可给我饿坏了,我要补回来) (

谢谢你的代码

不过这样填充的话

近2万条数据

速度太慢了啊
zyg0 2005-08-05
  • 打赏
  • 举报
回复
With MSHFlexGrid1
If Not re.EOF Then

.Clear
.Rows = 1
.TextMatrix(0, 0) = re.Fields(0).Name
.TextMatrix(0, 1) = re.Fields(1).Name
.TextMatrix(0, 2) = re.Fields(2).Name
.TextMatrix(0, 3) = re.Fields(3).Name
.TextMatrix(0, 4) = re.Fields(4).Name
.TextMatrix(0, 5) = re.Fields(5).Name
.TextMatrix(0, 6) = re.Fields(6).Name
.TextMatrix(0, 7) = re.Fields(7).Name
i = 1
Do Until re.EOF
.Rows = .Rows + 1
.TextMatrix(i, 0) = re.Fields(0) & ""
.TextMatrix(i, 1) = re.Fields(1) & ""
.TextMatrix(i, 2) = re.Fields(2) & ""
.TextMatrix(i, 3) = re.Fields(3) & ""
.TextMatrix(i, 4) = re.Fields(4) & ""
.TextMatrix(i, 5) = re.Fields(5) & ""
.TextMatrix(i, 6) = re.Fields(6) & ""
.TextMatrix(i, 7) = re.Fields(7) & ""
i = i + 1
re.MoveNext
Loop
End If

Set re = Nothing
cjlong 2005-08-05
  • 打赏
  • 举报
回复
用FOR 循环???

请教了~~~~~


×××××××××××××××
to :greentest(淡)
用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'))"
在SQL 查询器里执行时是可以正常返回19000多条数据的

greentest 2005-08-05
  • 打赏
  • 举报
回复
那是你的条件限制了记录数,没有其他问题
晕,真不知道你是怎么想的
zyg0 2005-08-05
  • 打赏
  • 举报
回复
你不用 set MSHFlexGrid1.datesouse=rs
用for循环添加的方法看一下
cjlong 2005-08-05
  • 打赏
  • 举报
回复
sql="select * from xx"

应该是

sql="select * from a"
Feather2005 2005-08-05
  • 打赏
  • 举报
回复
不是MSHF控件的问题,问题出在你的SQL语句上,不信你可以在查询分析器里面试试。
coobila 2005-08-05
  • 打赏
  • 举报
回复
有这么多行,该分页显示了。要不....

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧