这个与你那个出错的数据表有关,EMP_ID字段的值有问题,超出了范围。你检查下那个表的这个字段的定义。

解决方案 »

  1.   

    今天 有DEDE 反编译了下得到 (当前系统Apserver) 的结构是这样的就写了如下几个事件
     
      

  2.   

      emp_id  是NUMBER  我换成BDE 连接后不存在提示EMP_ID 那问题了
      

  3.   

    好吧 可能是我表述的不清楚 重新整理如下:
      最近学习下三层,先写了Server端,数据库用的是ORacle ,远程数据模块如下图;用了ADOConnection*1,AdoQuery*1 (命名OraQryData);AdoSproc*1(OraSpc), DataSetProvider*2(命名:oraQry,OraSproc);控件件若干,分别设定连接关系 如下图 ,中间没加任何代码,运行服务端;
     然后写Client 端,用的是ClientDataset*2(命名为Qry1,Sproc), TScokConnetion*(SockCon1)1, SockCon1 设置边到Server 端的数据模块,其它属性设置为:Qry1.RemoteServer=SockCon1,qry1.DatasetProvide=oraQry;Sproc.remoteServer=SockCon1,Sproc.DataSetProvider=OraSproc
      Client 代码:
                Button1.clink;
             with qrydata do
             begin
                 close;
                 commandtext:='select * from sys_emp where rownum<500';
                 open;
             end;
    错误提示如下图
            O 
    (注:Emp_id 为Number 类型 ,如果我把Server 连接控件改成 BDE 控件(TDATABAS,Tssieon,TQuery)不加任何代码 查询不会报错)调用数据库存储过程的代码如下: 
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      with sproc do
      begin
        Close;
        Params.Clear;
        DataRequest('SJ_CKRT_SN') ;
        FetchParams;
        ShowMessage(IntToStr(Params.Count));//参数个数是0
       // Params.ParamByName('TREV').AsString:='SSSN';
       // Execute;
       // ShowMessage(Params.ParamByName('TRes').AsString);  end;
    end;
    运行结果显示的为0,就是得不到参数!!请各位高手帮指导下这个Delphi 三层结构下,怎么调用ORACLE 存储过程? 
      

  4.   

    接上楼
         我是做MES系统二次开发的,模式为D7+Oracle 三层;MES系统是Apserver+Client; 以上同样的代码连到MES系统的Apserver不会有任何问题 苦于没有源码,不知道他做了如何处理, 用DEDE 反编译下他的Apserver Exe
    其APERVER 远程数据模块如下图,处理代码写在DatasetProvider 的OnDataRequest 事件下看了些书上说的三层 ,书上介绍的就是几个控件的用法,其他均未提,此开贴望各们给点思路,介绍点学习资料  谢谢
      

  5.   

    楼上开发的是sajet的sfc系统吗,看到存储过程使用的sj开头啊,我公司用的也是这个,不过改了很多了
      

  6.   


    SAJET的系统是COM+的三层架构,我贴一个我之前写的APSERVER
    unit Unit2;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
      Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
      DBClient, Apserver_TLB, StdVcl, Provider, DB, ADODB;type
      TApSqlConn = class(TRemoteDataModule, IApSqlConn)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DspQueryData: TDataSetProvider;
        procedure RemoteDataModuleCreate(Sender: TObject);
        procedure RemoteDataModuleDestroy(Sender: TObject);
      private
        { Private declarations }
      protected
        class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
      public
        { Public declarations }
      end;implementation{$R *.DFM}
    uses Unit1 ;class procedure TApSqlConn.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
    begin
      if Register then
      begin
        inherited UpdateRegistry(Register, ClassID, ProgID);
        EnableSocketTransport(ClassID);
        EnableWebTransport(ClassID);
      end else
      begin
        DisableSocketTransport(ClassID);
        DisableWebTransport(ClassID);
        inherited UpdateRegistry(Register, ClassID, ProgID);
      end;
    end;procedure TApSqlConn.RemoteDataModuleCreate(Sender: TObject);
    begin
        Form1.UpdateClientCount(1);
    end;procedure TApSqlConn.RemoteDataModuleDestroy(Sender: TObject);
    begin
        Form1.UpdateClientCount(-1);
    end;initialization
      TComponentFactory.Create(ComServer, TApSqlConn,
        Class_ApSqlConn, ciMultiInstance, tmApartment);
    end.