在使用dbexpress的存储过程组件做查询时,第一次能查询出数据来,但第二次却提示:Project Invocesystem.exe raised exception class EDatabaseError with message 'Database Server Error:SQL State:HY000,SQL Error Code:0

解决方案 »

  1.   

    提示好像是sql出错,
    是不是你的查询控件在第二次使用的时候没有clear里面的sql语句?
      

  2.   

    说明什么数据库,存储过程参数列表。
    DBExpress在执行存储过程的时候是存在一些小问题
      

  3.   

    环境:Delphi2005 sp3,sqlserver2000数据库,并且打了补丁
    第二次查询时清空了SQL语句,存储过程参数肯定没问题,因为第一次都能查询
      

  4.   

    是否是DBExpress组件的错误啊?好像D7下就没有这个错误
      

  5.   

    可能数据库连接数的问题,先检查sqlserver2000的用户数,或者在第二次查询时重新初始化调用存储过程的控件(close然后重新设置存储过程名),断开服务器重新连接一下也可以解决问题。
      

  6.   

    请问Sql的用户数在哪设置啊,楼上说的第二次查询重置操作已经设置过了,还是不行
      

  7.   

    不用用参数的方式调用
    直接用
    begin
      call xx;
    end;
    这样的方式试一下
      

  8.   

    01 procedure TLocalDataModuleForm.InvoceReport(date1, date2, payee,flag: String);
    02 begin
    03   ClientDataSet.Active := False;
    04   with SQLStoredProc do
    05   begin
    06     Close;
    07     StoredProcName := 'invocereport';
    08     Params.ParamByName('@date1').Value := date1;
    09     Params.ParamByName('@date2').Value := date2;
    10     Params.ParamByName('@payee').Value := payee;
    11     Params.ParamByName('@flag').Value := flag;
    12     //Prepared := True;
    13     //Active := True;
    14     Open;
    15   end;
    16   DataSetProvider.DataSet := SQLStoredProc;
    17   ClientDataSet.Active := True;
    18 end;
    以上就是一个数据模块中的代码,在和二次查询时报错,报错信息见最顶楼,但将03,17行去掉却可以查询数据,但客户端DBGrid却无法更新
    连接模式如下:
    DBGrid-DataSource-ClientDataSet-DataSetProvider-SQLStoredProc
    因DBExpress无双向记录机制,故用类三层结构
      

  9.   

    比如我的存储过程
    create  PROCEDURE abc 
        @vchSourceSafeINI varchar(255) = '',
        @vchProjectName   varchar(255) =''
    AS
    select * from fee
    GO----
    那么我调用的时候直接用SQLDataSet 设置CommondText为:
    exec abc '1','3'
    通过 ClientDataSet查询数据集返回正常。
      

  10.   

    好办法,值得一试,不过DBExpress组件好像就是有最顶楼所述的问题,不知有没有高手遇到过呀!
      

  11.   

    奇怪用SQLDataSet试过了,一切正常,为什么SQLStoredProc就不对呢,有BUG啊?
      

  12.   

    SQLStoredProc.close;
    SQLStoredProc.Params.Clear;
    SQLStoredProc.StoredProcName:='';
    SQLStoredProc.SchemaName:='dbo';
    SQLStoredProc.StoredProcName := 'invocereport';
    这样看看
      

  13.   

    将  03   ClientDataSet.Active := False;
    改成
    if ClientDataSet.Active =True then
        ClientDataSet.Active:=False;
    试一下