如题,当adodataset中有好几万条记录时,locate命令就不太快了,
好象它是从头到尾收索的,我的数据库是SQL SERVER,表建了索引,
可是用SEEK命今出错,说“当前提供程式不支持索引功能的界面”
这是为什么呀?
 我是这样调用SEEK的。
 adodataset1.close;
 adodataset1.commandText:='select * from table1';
 adodataset1.indexname:='index1';
 adodataset1.Open;//
 adodataset1.seek('abcd',soFirstEQ);   //此时出错,表中确有建立名为idex1的索引

解决方案 »

  1.   

    可否自已建个函数,排序后用二分法查找,就不必从头至尾找了,
    可是不知如何访问数据集的数据,看了DELPHI自已提供的locate函数,最终调用的是
    find的函数,可它是ADO组件提供的接口,看不到它的源代码,如何是好啊?
    如果是C#就好了,可以很容易就写个二分法的查询函数。
      

  2.   

    为什么不用完全用SQL语句来做,即selec * from table where field=XX,这样来写呢?这样写它的速度会相当快的。对于才有几万条的SQL server来说不是头问题。
      

  3.   

    TO fanyufanyu(反语) ( ) :
     是这样的,因为这个表我已打开到本地,并且要反复查询很多次,如果每查一次都到服务器查询,
    势必会受到网络影响,并且会影响到服务器的性能,我想SQL服务器能够做到事,我们的程序为什
    么做不到呢?
      

  4.   

    把那么大的表下到本地,是不是过分了一点,还是用fanyufanyu(反语)的方法吧.
      

  5.   

    几万条不算多,用 where 条件限制不会很慢的.
      

  6.   

    To QQgenie(妖魔鬼怪) 
     那个虽大,可是我不是整个下载的,只取其中两个字段,很快就打开了,
    我主要是判断是否有指定记录存在这个表中.TO fanyufanyu(反语) :
      我用的是ADODATASET,不用SEEK时,用LOCATE命令决对是在本地查找的,
    不会到服务器上查找,因为ADO是有缓冲的,会把所有数据读到本地内存中。我要查找10多万次,如果老是从服务器上去找,是不是太慢了呢?
      

  7.   

    是的ADO是有缓冲,但它是有大小限制的(任何缓存都有大小限制),你的库有几万条记录,我想它是不能都放在缓冲区里的,所以只能算部分本地化。
    如果可能的话,你可以用DBExpress来连接SQL Server,不用ADO。DBExpress的速度更快。因为DBExpress的连接方式是单向的,对你你的查询来说,只要使用客户端到服务器的连接就可以了,这种方式不能把修改提交给服务器,只能从服务器上取数据,比ADO的双向连接快上很多。你可以试试。
    “10多万次”为什么会这么多,你的查询频率又是多少,即每秒多少次?
    事实上对于SQL Server来说,几万条记录,同时有几十个用户在并发查询是没有问题的。
    对于SQL语句来说,你还可以使用存储过程,这样服务器的执行速度会大大提高,客户端只要每次提交时,给出查询的值,作为参数传给服务器就可以了。
    即然只取两个字段,为什么不建立一个视图,让这个视图只包括这两个字段不就行了。这属于“投影”操作,不必对原始表进行操作,还能更进一步提高查询效率。
      

  8.   

    谢谢各位,我其实在为本单位写一个考勤程序,用IC刷卡,以前没写过,第一次写这个东西,有4000多人,每月至少50万条记录,我用程序测了一下,全部处理一次共要接近5分钟,我想尽量提高这个速度,
    不知一般最快要多久。上面提到的用DBExpress是个不错的主意,我先试试。
      

  9.   

    还有一样最重要的东西,楼主没有说,就是库结构。知道这些东西大家才能帮你更好的解决。
    考勤光查询,不写数据好像不太符合要求,光用两个字段来解决它有点勉强。我想出一个刷卡时不查询的方法,即水流号,IC卡号,刷卡时间两个字段,每次刷卡只追加记录,不需要查询任何东西。
    只有在月末开支的时候,才进行查询记录,查询的条件是,每天每个IC卡第一次刷卡时间和最后一次刷卡时间作为考勤依据。(如果午休时也要刷卡就不能这样做了),最后把每个员工的数据生成一个个新的数据表(也可以是临时表)。这样做虽然速度能慢一些,但每月也只是由管理员运行一回也就够了,不会影响到考勤员工。这样做不知道楼主感觉如何?
    就是全部处理一次20分钟(不知道楼主说的是不是月底结算时)也可以接受的。
      

  10.   

    早上好!
    我现在把ADO和DBExpress混合用,dbExpress用来读取打卡记录,
    ADO负责写表,打卡记录共50多万条,现在是模防月低统计(生成每个人的打卡明细记录)
    也就是每人共30或是31条,共4000 *31条,我们的考勤包括:上午班(上,下),
    下午班(),晚上加班(有强迫加班的,也有自原加的),还有跨夜的,及请病假,事假,
    出差。采用了DBExpress之后只用了4分钟,比以前快了半分钟,我是用程序生成50万条记录,
    实际上不只,超过70万条(4000*6 *31),现在有些地方还有等待优化.
    实际运行时是每天一计算,反正时间也不长,然后共其他人查询.
      

  11.   

    还是用select来得快,只要你建好索引,而且简单
      

  12.   

    你还可以根据情况,把ADO和DBExpress里的一些参数调整一下,如缓存记录数等。性能还能再提高一点,而且还不需要改一行代码。
      

  13.   

    怪事,如果全部换成了DBExpress,结果反而慢了,可能原因是DBEXpress中的SQLDATASET的LOCATE命令
    比ADO的还要慢。
      

  14.   

    hello,楼上们好,请问一下,这个DBExpress怎么用啊,我怎么也搞不出来啊,SQLConnection,能说说吗,我想知道。我的QQ:382644982
      

  15.   

    TADODataSet、TADOQuery和TADOTable组件的MarshalOptions控制了客
        户端修改的数据如何传递回OLE DB Provider或数据源进行更新的工作。在分布式
        多层应用系统和Internet/Intranet及电子商务应用系统中我们绝对不希望传递任何多
        余的数据,以避免浪费网络资源。因此适当地设定MarshalOptions属性值为
        moMarshalModifiedOnly也可以增加应用系统的执行效率。
    *******************************************************
        对于和图形用户接口有关的ADO应用程序,例如,如果需要在TDBGrid组
        件中显示大量的数据,那么不要忘记我们早已熟知的技巧,暂时关闭数据感知组
        件和A D O存取组件之间的关系,等待数据存取的工作完成之后再启动连接,那么
        将可以大大增加图形用户接口响应用户的效率。这就是说,当应用程序要结合大
        量数据存取和图形用户接口时,不要忘记调用Disable Controls和Enable Controls这
        两个方法。*******************************************************************************
    数据库中建表最好:用“ 数值型”做 主键 ,那速度会快很多的
    *************************************************
    SQL语句中不要用*,要列举出要用到的字段,这样速度会快很多很多的(use this:select no,name from table)