我把原来两层的架构改成三层的服务端使用
ADOConnection1+ADOQuery1+DataSetProvider1客户端是用
SocketConnection1+ClientDataSet1 但现在我遇到一个问题,我在原来两层里面用了一个ADOStoredProc1来调用存储过程(用的是Oracle数据库)但现在在三层架构里如何用这个控件来连中间层呢?小弟弟在线等待,麻烦大哥们帮帮忙谢谢

解决方案 »

  1.   

    to ljz9425还有没有其他的方法呢?在三层架构的情况下如何调用Oracle的存储过程呢?
      

  2.   

    还是用ADOStoredProc1调用储存过程,用DataSetProvider1返回参数。
      

  3.   

    to Oraclers
    那用ADOStoredProc1如何连接中间层呀,我看了里面没有连接SocketConnection1的选项呀
    麻烦你能不能说得明白些如何关联,万分感谢
      

  4.   

    下面的代碼是中間層的,用ADOStoredProc1调用储存过程,用DataSetProvider1返回参数。
    {自動產生“固定資產編號”過程執行后返回編號﹒}
    procedure TFAUpdateData.dspAutoNumberAfterExecute(Sender: TObject;
      var OwnerData: OleVariant);
    begin
      if spAutoNumber.Parameters.ParamByName('@RETURN_VALUE').Value = 0 then
        OwnerData := spAutoNumber.Parameters.ParamByName('@AssetsNumber').Value
      else
        OwnerData := 'Invalidity';
    end;{產生“固定資產編號“}
    procedure TFAUpdateData.dspAutoNumberBeforeExecute(Sender: TObject;
      var OwnerData: OleVariant);
    begin
      if not ((VarIsEmpty(OwnerData)) or (VarIsNull(OwnerData))) then
      with spAutoNumber.Parameters do
      begin
        ParamByName('@City').Value := OwnerData[0];
        ParamByName('@Value').Value := OwnerData[1];
        ParamByName('@Corp').Value := OwnerData[2];
      end else
      with spAutoNumber.Parameters do
      begin
        ParamByName('@City').Value := '';
        ParamByName('@Value').Value := -1;
        ParamByName('@Corp').Value := '';
      end;end;{Procedure TFAUpdateData.dspAddModeAfterExecute Return a Value.所有
    返回值為@RETURN_VALUE都調用這個過程﹒}
    procedure TFAUpdateData.dspAddModeAfterExecute(Sender: TObject;
      var OwnerData: OleVariant);
    var spDataSet : TDataSet;
    begin
      spDataSet := TDataSetProvider(Sender).DataSet; {得到過程執行時的數据集}
      OwnerData := TADOStoredProc(spDataSet).Parameters.ParamByName('@RETURN_VALUE').Value;
    end;
      

  5.   

    在客戶端用一個用一個TSocketConnection 連接到中間層服務器,用TClientDataSet去調用中間層的TDataSetProvider,ClientDataSet的RemoteServer層性設置為SocketConnection1(就是前面已建立的連接),ProviderName屬性設為中間層中TDataSetProvider的名字,本例中就是dspAutoNumber。下面是客戶端調用產生“固定資產編號”的代碼:
    //AutoNoParam : OleVariant;{自動產生編號的參數}
    procedure TEditForm.sbtnAssetsNoClick(Sender: TObject);
    begin
      with FADM do
      try
        try
          AutoNoParam := VarArrayCreate([0,2],varVariant);//設置輸入參數
          cdsAutoNumber.Params.Clear;
          AutoNoParam[0] := cdsFAClone.FieldValues['City'];
          AutoNoParam[1] := cdsFAClone.FieldValues['AccountMoney'];
          AutoNoParam[2] := cdsFAClone.FieldValues['CorpName'];
          cdsAutoNumber.Execute;
          cdsFAClone.FieldValues['AssetsNo'] := sAssetsNo; //執行後事件將返回的“固定資產編號”賦值給sAssetsNO,這裡將sAssetsNo編號賦值給一個編輯固定資產的ClientDataSet
        except
          ShowMessage('未能正确產生編號,請檢查入帳金額﹑所在城市﹑所屬公司等輸入是否正确﹗');
        end;
      finally
        VarClear(AutoNoParam);
      end;end;
    //cdsAutoNumber執行後事件代碼:
    {自動產生資產號后,取得產生的資產號}
    procedure TFADM.cdsAutoNumberAfterExecute(Sender: TObject;
      var OwnerData: OleVariant);
    begin
      if not ((VarIsEmpty(OwnerData)) or (VarIsNull(OwnerData))) then
        sAssetsNo := OwnerData;
    end;
      

  6.   

    to Oraclers
    我用了你的方法还是不行呀我在网上看了一个例子是直接用ClientDataSet1来调用的代码如下
    form2.ClientDataSet3.Close;
    form2.ClientDataSet3.params.clear ;
    form2.ClientDataSet3.Params.CreateParam(ftString,'ParamName1',ptInput) ;
    form2.ClientDataSet3.Params.CreateParam(ftString,'ParamName2',ptInput) ;
    form2.ClientDataSet3.Params.CreateParam(ftBCD,'ParamName3',ptOutput) ;
    form2.ClientDataSet3.CommandText:='{call SP_LOGIN(?,?)}';  //这里是调用用户登录的存储过程 把用户名和密码传进去如果通过就返回0否则返回-1
    form2.ClientDataSet3.Params.ParamByName('ParamName1').Value:='102704';
    form2.ClientDataSet3.Params.ParamByName('ParamName2').Value:='060105';
    form2.ClientDataSet3.open ;
    但运行到form2.ClientDataSet3.Params.ParamByName('ParamName1').Value:='102704'; 这句的时候报以下错误这是为何?麻烦帮看看万分感谢
    ClientDataSet3:Paramete 'ParamName1' not found
      

  7.   

    to Oraclers
    我用了你的方法还是不行呀
    客戶端執行前需傳遞參數。
    procedure TFADM.cdsAutoNumberBeforeExecute(Sender: TObject;
      var OwnerData: OleVariant);
    begin
      OwnerData := AutoNoParam;
    end;
      

  8.   

    使用TSocketConnection的ConnectionString属性。连接