关于不同数据库与DBGrid的奇怪现象(100分)

  • 主题发起人 主题发起人 Sun
  • 开始时间 开始时间
S

Sun

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么DBGrid与*.db的表相连时的滚动条是平滑的,而与其他的数据库
相连时DBGrid滚动条是粗糙的?
有没有什么办法使在联其他数据库时DBGrid的滚动条也是平滑的?
或有没有其他的控件代替DBGrid解决这个问题?
 
JeffGrid from DSP. support different color panel for rows and cols. and with smooth scroll bars.
 
JeffGrid 在哪里可以下载?
 
没有啊,连oracle和paradox是一样的,我用的是Delphi 3,
不治你用的是多少?
 
Delphi Super Page (http://sunsite.icm.edu.pl/delphi/)
 
不会吧?看看delphi的dbgrid源代码,对任何数据库dbgrid都是通过
bde一样处理的.可能与显示表的大小有关,试试.db和别的数据库数据
完全相同如何?应该是一样的.别拿inprise当M$,偏向自己的孩子.



 
chenke,rss没理解我的意思你用SQL Explorer 打开一个*.DB表和一个其他
数据库的表比较一下滚动条就知道了
 
Another_eYes:
DSP上没有啊!
 
其实和Client/Server的SQL数据库的查询方式有关, Local文件型数据库查询
时是将所有记录都查询出来, 这样你在下一不操作前就可取得记录条目数,
自然可以定滚动条的各种属性值. Grid的滚动条自然就平滑了.

server端数据查询时只会将当前已查询出来的数据传送出来, 你此时并不知道
到底有多少条记录符合条件, 可能是10, 100,1000条,
只有到全部记录传送到客户端后, 你才可能知道数据集究竟有多少条记录,(这样
做要花费大量时间).

可能我说的并不清楚, 打个比方:
一次 select * from table1 where A> 1 的记录条目数有许多,
SQL server 先查询出一部份记录来传送, 如 200条, (此数在客户端可以设定.)
你此时在客户端的grid中只看到一部份, 你不断的向下浏览, 当快浏览完200条后
客户端会向server请求下一部分数据集, (再查询传送下一组200条),
...如此这样....直到查询完毕.
这样的工作模式, 客户端无法在没有查询完毕时, 内取得结果记录数的总和,
也就无法设定滚动条.

Grid控件处理垂直滚动条的过程中, 对Local文件型数据集和Client/Server SQL数据
集的处理方式是不一样的, 对Local文件型数据库, 取数据总和当前记录的位置来设定
滚动条, 对于SQL Server数据集时, 取三种状态:

BOF : 拉子放于顶部;
Not BOF and Not EOF : 中间;
EOF : 底部.

这就是SQL server数据集在Grid 中滚动条移动不光滑的原因.
 
你要的grid已通过email发出
 
SeaKey:
TBDEDataSet是有RecordCount这一属性的,指明返回的记录数的。
*.dbf也是文件型数据库,显示这类表的DBGrid的滚动条也是不
平滑的。
 
Another_eYes:
谢谢你!
但它不是for Delphi4.0版的!
 
Sun :
我看过TCustomDBGrid中的UpdateScrollBar的代码, 它是
通过判断所链接的DataSet中的IsSequenced属性来判别 是否
使用精确滚动条, 下面是IsSequenced的说明,

Indicates whether the underlying database table uses record numbers to indicate the order of records.

function IsSequenced: Boolean; virtual;

Description

Use IsSequenced to determine whether the underlying database table
supports sequence numbers, or whether these are computed by the dataset
component. When RecNo is True, applications can safely use the RecNo
property to navigate to records in the dataset.

As implemented in TDataSet, IsSequenced always returns True.
Descendants of TDataSet reimplement this method to return a value that
depends on the underlying table type.

>> TBDEDataSet是有RecordCount这一属性的,指明返回的记录数的
下面是TBDEDataSet.RecordCount的Help中注意事项,
Use RecordCount with care, because record counting can be a costly operation, especially for SQL queries that return large result sets. Generally, an application should only use RecordCount with Paradox and dBASE tables.

你可以做个试验, 设定两个Dataset, 一个是由SQL Server型数据库提供
另一个从*.db(or *.dbf)中提供, 两个数据集都有100000条记录, 程序中
分别读取RecordCount属性, 你会发现两个过程的差异有多大, *.db瞬间
完成, Sql server却要很长一会, 因为它要将所有记录全部下载完成, 才
可算出RecordCount.

顺便大家可以看一下原有的一个讨论题目: <a href=http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=92343>
DBRGid右边的滚动条如何去掉 </a>


>> *.dbf也是文件型数据库,显示这类表的DBGrid的滚动条也是不平滑的。

这我就没太注意, 不好意思, 我想这可能是BDE的工作方式决定的.
 
SeaKey:
TQuery的RecordCount返回的结果难道不是满足Where条件的记录数,而是数据库表中的
所有记录数?
 
Sun:
TQuery的RecordCount返回的结果当然是满足Where条件的记录数 .

我说的是数据集, 既包含TTable 也包含 TQuery 的查询结果记录数 , 你可以用
TQuery查询出一个上万条的结果集, 然后取RecordCount,
你看要多少时间, 针对*.db, *.dbf 和C/s Sql Server都试一试.
 
针对remote数据库reccount好象不确定,有时是0, 有时是全部记录数, 有时是个
奇怪的数字,总之是没用的(delphi 3)
 
seasky的回答很好,但不是问题的最核心。
我公司的开发人员被这个老大难问题困扰了好久。

不管是什么数据库。只要加了filter的,dbgrid的滚动条滚动必然不平滑。
原因是 1、dbgrid 判断是否加了filter,如果是,IsSequenced为真,真如seasky所说,dbgrid的滚动条根据recno来定位。不管什么数据库,这个很正常。
2、加了过滤后,dbgrid的滚动就不能根据recno来定位,因为记录的recno不连贯。inprise公司在这里就表现的马虎,一分为二,如果你拉过一半,就定位到
底,不然,滚动条还是定位到头。

有人改写过dbgrid,建议找找,下载。
 
zjuhui:
你知道在哪里下载改写过的dbgrid吗?
 
如果有,请给我一份,谢谢!!
 
顺便问问:本来Delphi3的DBGrid的滚动条好象只是表示记录位置,
并非表示DBGrid的内容显示位置,也就是说就算DBGrid里有两行,
无论DBGrid一版可以显示多少行,它都会出现滚动条。
现在我想在DBGrid显示不了全部记录的时候才出现滚动条,应该
如何办?
谢谢!
 
后退
顶部