如题,当adodataset中有好几万条记录时,locate命令就不太快了,
好象它是从头到尾收索的,我的数据库是SQL SERVER,表建了索引,
可是用SEEK命今出错,说“当前提供程式不支持索引功能的界面”
这是为什么呀?
我是这样调用SEEK的。
adodataset1.close;
adodataset1.commandText:='select * from table1';
adodataset1.indexname:='index1';
adodataset1.Open;//
adodataset1.seek('abcd',soFirstEQ); //此时出错,表中确有建立名为idex1的索引
好象它是从头到尾收索的,我的数据库是SQL SERVER,表建了索引,
可是用SEEK命今出错,说“当前提供程式不支持索引功能的界面”
这是为什么呀?
我是这样调用SEEK的。
adodataset1.close;
adodataset1.commandText:='select * from table1';
adodataset1.indexname:='index1';
adodataset1.Open;//
adodataset1.seek('abcd',soFirstEQ); //此时出错,表中确有建立名为idex1的索引
可是不知如何访问数据集的数据,看了DELPHI自已提供的locate函数,最终调用的是
find的函数,可它是ADO组件提供的接口,看不到它的源代码,如何是好啊?
如果是C#就好了,可以很容易就写个二分法的查询函数。
是这样的,因为这个表我已打开到本地,并且要反复查询很多次,如果每查一次都到服务器查询,
势必会受到网络影响,并且会影响到服务器的性能,我想SQL服务器能够做到事,我们的程序为什
么做不到呢?
那个虽大,可是我不是整个下载的,只取其中两个字段,很快就打开了,
我主要是判断是否有指定记录存在这个表中.TO fanyufanyu(反语) :
我用的是ADODATASET,不用SEEK时,用LOCATE命令决对是在本地查找的,
不会到服务器上查找,因为ADO是有缓冲的,会把所有数据读到本地内存中。我要查找10多万次,如果老是从服务器上去找,是不是太慢了呢?
如果可能的话,你可以用DBExpress来连接SQL Server,不用ADO。DBExpress的速度更快。因为DBExpress的连接方式是单向的,对你你的查询来说,只要使用客户端到服务器的连接就可以了,这种方式不能把修改提交给服务器,只能从服务器上取数据,比ADO的双向连接快上很多。你可以试试。
“10多万次”为什么会这么多,你的查询频率又是多少,即每秒多少次?
事实上对于SQL Server来说,几万条记录,同时有几十个用户在并发查询是没有问题的。
对于SQL语句来说,你还可以使用存储过程,这样服务器的执行速度会大大提高,客户端只要每次提交时,给出查询的值,作为参数传给服务器就可以了。
即然只取两个字段,为什么不建立一个视图,让这个视图只包括这两个字段不就行了。这属于“投影”操作,不必对原始表进行操作,还能更进一步提高查询效率。
不知一般最快要多久。上面提到的用DBExpress是个不错的主意,我先试试。
考勤光查询,不写数据好像不太符合要求,光用两个字段来解决它有点勉强。我想出一个刷卡时不查询的方法,即水流号,IC卡号,刷卡时间两个字段,每次刷卡只追加记录,不需要查询任何东西。
只有在月末开支的时候,才进行查询记录,查询的条件是,每天每个IC卡第一次刷卡时间和最后一次刷卡时间作为考勤依据。(如果午休时也要刷卡就不能这样做了),最后把每个员工的数据生成一个个新的数据表(也可以是临时表)。这样做虽然速度能慢一些,但每月也只是由管理员运行一回也就够了,不会影响到考勤员工。这样做不知道楼主感觉如何?
就是全部处理一次20分钟(不知道楼主说的是不是月底结算时)也可以接受的。
我现在把ADO和DBExpress混合用,dbExpress用来读取打卡记录,
ADO负责写表,打卡记录共50多万条,现在是模防月低统计(生成每个人的打卡明细记录)
也就是每人共30或是31条,共4000 *31条,我们的考勤包括:上午班(上,下),
下午班(),晚上加班(有强迫加班的,也有自原加的),还有跨夜的,及请病假,事假,
出差。采用了DBExpress之后只用了4分钟,比以前快了半分钟,我是用程序生成50万条记录,
实际上不只,超过70万条(4000*6 *31),现在有些地方还有等待优化.
实际运行时是每天一计算,反正时间也不长,然后共其他人查询.
比ADO的还要慢。
户端修改的数据如何传递回OLE DB Provider或数据源进行更新的工作。在分布式
多层应用系统和Internet/Intranet及电子商务应用系统中我们绝对不希望传递任何多
余的数据,以避免浪费网络资源。因此适当地设定MarshalOptions属性值为
moMarshalModifiedOnly也可以增加应用系统的执行效率。
*******************************************************
对于和图形用户接口有关的ADO应用程序,例如,如果需要在TDBGrid组
件中显示大量的数据,那么不要忘记我们早已熟知的技巧,暂时关闭数据感知组
件和A D O存取组件之间的关系,等待数据存取的工作完成之后再启动连接,那么
将可以大大增加图形用户接口响应用户的效率。这就是说,当应用程序要结合大
量数据存取和图形用户接口时,不要忘记调用Disable Controls和Enable Controls这
两个方法。*******************************************************************************
数据库中建表最好:用“ 数值型”做 主键 ,那速度会快很多的
*************************************************
SQL语句中不要用*,要列举出要用到的字段,这样速度会快很多很多的(use this:select no,name from table)