服务器一切正常,每个过程都可以执行,为什么客户端取不到数据?即使把MIDAS重新注册了还是不行?但很奇怪的是把服务器运行起来就可以取到数据了。按道理服务器端只要第一次运行注册一下不就行了吗?

解决方案 »

  1.   

    我的代码unit MainControl_RDM;
    interfaceuses
      Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
      DBClient, ControlSer_TLB, StdVcl, ADODB, Provider, DB;type
      TMainControlRDM = class(TRemoteDataModule, IMainControlRDM)
        adcnectMain: TADOConnection;
        adprocQuery: TADOStoredProc;
        dspQuery: TDataSetProvider;
        adprocQueryper: TADOStoredProc;
        adprocQuery_Go: TADOStoredProc;
        adprocQueryBill: TADOStoredProc;
        adprocDelData: TADOStoredProc;
        adoqUpload: TADOQuery;
        dspUpload: TDataSetProvider;
        adprocDelUpData: TADOStoredProc;
        procedure RemoteDataModuleCreate(Sender: TObject);
        procedure RemoteDataModuleDestroy(Sender: TObject);
        procedure adoqUploadPostError(DataSet: TDataSet; E: EDatabaseError;
          var Action: TDataAction);
      private
        { Private declarations }
      protected
        class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
        procedure UpLoad(const UpLoadSQL: WideString; out ErrorFlag: OleVariant);
          safecall;
        procedure DelData(const SiteNo, Date: WideString); safecall;
        procedure Query(const V_SiteNo: WideString; out Data: OleVariant;
          const CurDate: WideString); safecall;
        procedure Query_bill(const V_SiteNo: WideString; out Data: OleVariant;
          const CurDate: WideString); safecall;
        procedure Query_Go(const V_SiteNo: WideString; out Data: OleVariant;
          const CurDate: WideString); safecall;
        procedure Query_per(const V_SiteNo: WideString; out Data: OleVariant;
          const CurDate: WideString); safecall;
      public
        { Public declarations }
      end;implementation
      uses MainControlFrm;
    {$R *.DFM}class procedure TMainControlRDM.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 TMainControlRDM.UpLoad(const UpLoadSQL: WideString;
      out ErrorFlag: OleVariant);
    begin
      adoqUpload.Close;
      adoqUpload.SQL.Clear;
      adoqUpload.SQL.Add(UpLoadSQL);
      try
        adoqUpload.ExecSQL;
        ErrorFlag := 0 ;
        PostMessage(MainFrmHand,WM_SaveLog,0,integer(DateTimeToStr(now)+ 'UpLoad Success!'))
      except
        on e : Exception do
        begin
          ErrorFlag := 1 ;
          PostMessage(MainFrmHand,WM_SaveLog,0,integer(e.Message + DateTimeToStr(now)));
        end;
      end;
    end;procedure TMainControlRDM.RemoteDataModuleCreate(Sender: TObject);
    begin
     if Not( adcnectMain.Connected ) then
     begin
       adcnectMain.ConnectionString := MainControlForm.sConnect;
       adcnectMain.Connected := true;
       PostMessage(MainFrmHand,WM_SaveLog,0,integer(DateTimeToStr(Now)+ 'Connected Success'));
     end;
      MainControlForm.SetClientCount(1);end;
    procedure TMainControlRDM.DelData(const SiteNo, Date: WideString);
    begin
      with adprocDelData do
      begin
        Close;
        ProcedureName := 'sp_DelUpData';
        Parameters.CreateParameter('@Site_No',ftString,pdInput,2,SiteNo);
        Parameters.CreateParameter('@CurDate',ftString,pdInput,10,Date);
        try
          ExecProc;
          //PostMessage(MainFrmHand,WM_SaveLog,0,integer(DateTimeToStr(Now)+'DelData: sp_DelUpData'));
          close;
        except
        on e : Exception do
          PostMessage(MainFrmHand,WM_SaveLog,0,integer(e.Message + DateTimeToStr(now)));
        end;
      end;
    end;
    procedure TMainControlRDM.Query(const V_SiteNo: WideString;
      out Data: OleVariant; const CurDate: WideString);
    begin
      dspQuery.DataSet := adprocQuery;
      with adprocQuery do
      begin
        Close;
        ProcedureName := 'sp_query';
        Parameters.CreateParameter('@Site_No',ftString,pdInput,2,V_SiteNo);
        Parameters.CreateParameter('@Curdate',ftString,pdInput,10,CurDate);
        try
          Open;
        except
          on e : Exception do
          begin
             PostMessage(MainFrmHand,WM_SaveLog,0,integer(e.Message));
             Exit;
          end;
        end;
        Data := dspQuery.Data;
        Close;
        PostMessage(MainFrmHand,WM_SaveLog,0,integer(DateTimeToStr(Now)+'Query: sp_Query'));
      end;  // with
    end;procedure TMainControlRDM.Query_bill(const V_SiteNo: WideString;
      out Data: OleVariant; const CurDate: WideString);
    begin
      dspQuery.DataSet := adprocQueryBill;
      with adprocQueryBill do
      begin
        Close;
        ProcedureName := 'sp_query_bill';
        Parameters.CreateParameter('@Site_No',ftString,pdInput,2,V_SiteNo);
        Parameters.CreateParameter('@Curdate',ftString,pdInput,10,CurDate);
        //Parameters[0].Value := V_SiteNo;
        //Parameters[1].Value := CurDate;
        try
          Open;
        except
          on e : Exception do
          begin
            PostMessage(MainFrmHand,WM_SaveLog,0,integer(e.Message ));
            exit;
          end;
        end;
        Data := dspQuery.Data;
        Close;
        PostMessage(MainFrmHand,WM_SaveLog,0,integer(DateTimeToStr(Now)+'Query_go: sp_query_temp'));
      end;
    end;procedure TMainControlRDM.Query_Go(const V_SiteNo: WideString;
      out Data: OleVariant; const CurDate: WideString);
    begin
      dspQuery.DataSet := adprocQuery_Go;
      with adprocQuery_Go do
      begin
        Close;
        ProcedureName := 'sp_query_temp';
        Parameters.CreateParameter('@Site_No',ftString,pdInput,2,V_SiteNo);
        Parameters.CreateParameter('@Curdate',ftString,pdInput,10,CurDate);
        try
          Open;
        except
          on e : Exception do
          begin
            PostMessage(MainFrmHand,WM_SaveLog,0,integer(e.Message ));
            Exit;
          end;
        end;
        Data := dspQuery.Data;
        Close;
        PostMessage(MainFrmHand,WM_SaveLog,0,integer(DateTimeToStr(Now)+'Query_go: sp_query_temp'));
      end;
    end;
    procedure TMainControlRDM.Query_per(const V_SiteNo: WideString;
      out Data: OleVariant; const CurDate: WideString);
    begin
      dspQuery.DataSet := adprocQueryper;
      with adprocQueryper do
      begin
        Close;
        ProcedureName := 'sp_query_per';
        Parameters.CreateParameter('@Site_No',ftString,pdInput,2,V_SiteNo);
        Parameters.CreateParameter('@Curdate',ftString,pdInput,10,CurDate);
        //Parameters[0].Value := V_SiteNo;   //sp_query_per
        //Parameters[1].Value := CurDate;
        try
          Open;
        except
          on e : Exception do
          begin
            PostMessage(MainFrmHand,WM_SaveLog,0,integer(e.Message ));
            Exit;
          end;
        end;
        Data := dspQuery.Data;
        Close;
        PostMessage(MainFrmHand,WM_SaveLog,0,integer(DateTimeToStr(Now)+'Query_per: sp_query_per'));
      end;
    end;procedure TMainControlRDM.RemoteDataModuleDestroy(Sender: TObject);
    begin
      MainControlForm.SetClientCount(-1);
      PostMessage(MainFrmHand,WM_SaveLog,0,integer(DateTimeToStr(Now)+'DisConnect Success'));
    end;procedure TMainControlRDM.adoqUploadPostError(DataSet: TDataSet;
      E: EDatabaseError; var Action: TDataAction);
    begin
      PostMessage(MainFrmHand,WM_SaveLog,0,integer(e.Message + DateTimeToStr(now)));
    end;initialization
      TComponentFactory.Create(ComServer, TMainControlRDM,
        Class_MainControlRDM, ciMultiInstance, tmFree);  //  tmFree 线程模型Threading Model中的自由线程
                                                         //  只有tmFree才可以访问服务器界面线程
    end.