最近做的一个项目,使用SQL Server 数据库, 数据处理使用存储过程,处理比较复杂,使用查询分析器需要2秒,结果大概5000行,10多列,使用Delphi 经常出现超时情况,写了个小程序测试了一下,只用二层直接连接数据库,也会出现这种情况,即使timeout设地再大也无济于事,很是郁闷.
后来使用JAVA JDBC连接数据库,就重来没出过这种情况,杯具 不知道大家有没有这种情况

解决方案 »

  1.   

    使用Delphi查询肯定有问题楼主可以把Delphi的查询跟Java的查询都贴出来,这样才能解决问题。
      

  2.   

    应该是你的程序或使用的控件有问题,delphi的强项不会输给JAVA的
      

  3.   

    那是你SQL语句或是你程序的问题,这么点数据不可能出现超时的
      

  4.   

    使用查询分析器需要2秒,使用delphi也应该2秒啊怎么会超时??
      

  5.   

    Delphi的查询跟Java的查询 都是引用存储过程  都是一样的控件方面,在测试程序中只用了
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;做了这么多年了,不会阴沟翻船的,再说有时候还是可以取出数据的,程序上不会有错
      

  6.   

    不使用dbgrid,不关联datasource,仅仅open速度怎么样?
      

  7.   

    1. 检查一下Sql Server的协议配置
    2. 存储过程返回的是执行结果还是结果集,如果是结果集可能跟数据感知控件的绑定有关
    3. 使用JDBC访问数据库没有问题,ADO访问肯定也没有问题 
      

  8.   

    ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password=pw;Persist Security Info=True;User ID=sa;Initial Catalog=aa;Data Source=192.168.0.1'    ADOConnection1.Connected:=true; 情况下运行下面语句    with ADOQuery1 do begin
            Close;
            sql.Text:=Trim(Edit1.Text);
            Open;
        end;    sql语句都是调用存储过程,与查询分析器里都是一样的
      

  9.   

    用ADO控件设置超时,是设置TADOQuery的超时,不是设置TADOConnection的超时。
      

  10.   

    ADOQuery.CommandTimeout 默认就是30 足够了
      

  11.   

    我一直怀疑是数据库的问题,因为5000X10的数据也没多少啊,但就是想不明白为什么在查询分析器和使用JAVA就能显示出来,Delphi 就不行,好像是卡住了一样 
      

  12.   

     with ADOQuery1 do begin
      Close;
      sql.clear;  //加上这句
      sql.Text:=Trim(Edit1.Text);
      Prepared;   //加上这句
      Open;
      end;
      //还有就是楼主检查下adoquery有没有计算字段,这影响最大了。如果有的话,改成left join。
      

  13.   

    delphi C/S和直接用查询分析器差不多啊。怀了
      

  14.   

    5000条数据,如果这样DELPHI就卡死了话,那ADO谁还会用啊估计是界面显示的时候(GRID绑定)有问题吧
      

  15.   

    没遇到过LZ的这种问题,平时显示1-2万都是很快的
    应该是代码或者是你这个存储过程使用Adoquery来处理时有问题,换存储过程控件
    试一下。
      

  16.   

    应该是哪里搞错了吧。DELPHI不至于那么慢!应该只会比JAVA快。
      

  17.   

    楼主加上这句 ADOConnection1.Connected:=true;测试的话,做比较就不公平了
    很早以前就有人讨论过这个问题,
      

  18.   

        我还在多方面测试中,其实,问题不是客户端显示5000行数据的问题,我想即使5万对delphi来说也不可能超时的,关键是调用了一个比较复杂的SQL Server 存储过程,该存储过程以一个1万行数据的表(还在不断增加中)为基准,再与10几个表中取数据来计算结果(没用游标,我明白那玩意的效率), 哎,我也不想这样,但没办法!计算过程是比较复杂的,要不5000行在查询分析器中也不可能要2秒之多啊,
        想不明白的是,既然数据库能计算出结果,为什么同样是5000行的数据,delphi客户端调用就是不一样,为什么使用java就不受影响.
      

  19.   

    另外 还发现一个有趣的问题,使用数据库的监测工具
    使用查询分析器执行   3秒  能显示运行的记录
    使用delphi    大概在点"打开"后30秒左右  显示运行的记录,期间没有任何提示,可能是监测工具只能完成查询和数据传输后才显示吧难道是编码转换的问题?
    可有时也快的啊?
    也不可能是服务器的性能问题,因为使用查询分析器任务时候都是需要2~3秒
      

  20.   

    以前测试sybase时发现,检测工具是一边查询出数据,一边就显示出来,ado类似的,而delphi好像要查询出所有的数据才一起显示,数据多时容易超时。所以用ado做三层挺多的,是否这方面的问题?我用delphi做程序都是将超时时间加大(说错了别挂我)
      

  21.   

    直接用DataBase,肯定没问题。
    ADO的貌似有的时候呵呵。
      

  22.   

    你Java是分页显示的吧,只查一部分当然很快.Delphi一下把5000条数据都查回来,显示当然慢
      

  23.   

    Delphi+ADO,Java+JDBC,执行同样的SQL语句(调用同一存储过程),前者有时会出现超时,后者都正常
    理论上是不会的,请确认
    1、两种情况下数据加载到界面的方式是否相同,有没有分步读取,分页显示等处理
    2、排除数据绑定控件原因
    3、ADO驱动有没问题