初学三层,大家帮忙给个例子,给出应有层和客户层的代码,很简单的就好,比如登录这一块的代码。
help!!!!

解决方案 »

  1.   

    delphi 里的demos/midas/Login 目录下有,你看看把
      

  2.   

    李维的书上也有简单的例子, AD为\MTS\COM+编程
      

  3.   

    一、服务端设计
      1、创建TDataModule,TDmSrv = class(TDataModule),添加组件
        保存PAS为DmSrvP.pas
        adoSrv: TADOConnection;
        AdoQry: TADOQuery;
        AdoQry连接adoSrv  2、创建远程数据模块TRemoteDataModule
         File->New->Multitier->Remote Data Module->
         CoClassName:RDmSrv->ok  3、在RDmSrv上放一组件
         dspAdoQry: TDataSetProvider;     属性DataSet:DmSrv.AdoQry
         注意:在implementation段下加入代码
         uses DmSrvP;二、客户端设计  1、建立TDataModule,TDmCli = class(TDataModule),添加组件 
        DCOMConn: TDCOMConnection;
        cdsDSet: TClientDataSet;
        dsDSet: TDataSource;
        
        dsDSet连cdsDSet连DCOMConn,DCOMConn的ServerName连YliaoServer.RDmSrv,
        注意YliaoServer是我的服务器工程名三、思路   1、客户端执行SQL代码,提交给中间层TClientDataSet,触发dspAdoQryDataRequest
       2、在dspAdoQryDataRequest事件里,编写查询、操作DmSrv数据模块里数据库的方法
       
    四、功能介绍   1、在客户端输入SQL代码,分查询数据的(对应Query.Open)与执行的(对应Query.ExecSQL)。然后选是“查询O”还是“执行E”,将标志O或E接到SQL代码首位置
       
       2、执行DataRequest,触发服务器DataRequest
       3、在服务器DataRequest,区分代码,连接DmSrv里AdoQry,装载SQL代码,OPEN或EXECSQL
      

  4.   

    五、源代码1、服务器源代码★YliaoServer.dprprogram YliaoServer;uses
      Forms,
      MainP in 'MainP.pas' {Main},
      DmSrvP in 'DmSrvP.pas' {DmSrv: TDataModule},
      YliaoServer_TLB in 'YliaoServer_TLB.pas',
      RDmSrvP in 'RDmSrvP.pas' {RDmSrv: TRemoteDataModule} {RDmSrv: CoClass},
      PublicP in 'PublicP.pas';{$R *.TLB}{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TMain, Main);
      Application.CreateForm(TDmSrv, DmSrv);
      Application.Run;
    end.★MainP.pasunit MainP;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TMain = class(TForm)
        gbSQL: TGroupBox;
        memSQL: TMemo;
        gbOpr: TGroupBox;
        lbOpr: TListBox;
        procedure FormShow(Sender: TObject);
        procedure lbOprClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Main: TMain;implementationuses DmSrvP, PublicP;{$R *.DFM}procedure TMain.FormShow(Sender: TObject);
    begin
      lbOPR.Clear;
      memSQL.Clear;
      DmSrv.adoSrv.Connected := False;
      DmSrv.adoSrv.Connected := True;
    end;procedure TMain.lbOprClick(Sender: TObject);
    var
      ptrData: PMyOpr;begin
      if lbOpr.Items.Count < 1 then exit;
      if lbOpr.ItemIndex < 0 then exit;  ptrData := PMyOpr(lbOpr.Items.Objects[lbOpr.ItemIndex]);
      memSQL.Clear;
      memSQL.Lines.Add(ptrData^.OprSql);
    end;procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      DmSrv.adoSrv.Connected := False;
    end;end.★RDmSrvP.pasunit RDmSrvP;interfaceuses
      Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
      DBClient, YliaoServer_TLB, StdVcl, Provider, Dialogs;type
      TRDmSrv = class(TRemoteDataModule, IRDmSrv)
        dspAdoQry: TDataSetProvider;
        function dspAdoQryDataRequest(Sender: TObject;
          Input: OleVariant): OleVariant;
      private
        { Private declarations }
      protected
        class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
      public
        { Public declarations }
      end;implementationuses DmSrvP, MainP, PublicP;{$R *.DFM}class procedure TRDmSrv.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;function TRDmSrv.dspAdoQryDataRequest(Sender: TObject;
      Input: OleVariant): OleVariant;var  lsFlag,
      lsExec,
      lsSQL,
      lsSucc,
      lsStr: String;  ptrData: PMyOpr;
    begin
      Result := 'T';  lsStr := Trim(String(Input));
      lsFlag := UpperCase(Copy(lsStr,1,1));
      lsSQL := Copy(lsStr,2,length(lsStr)-1);
      lsSucc := '成功!';  if DmSrv.adoSrv.InTransaction then
        DmSrv.adoSrv.RollbackTrans;
      DmSrv.adoSrv.BeginTrans;  with DmSrv.AdoQry do
      begin
        Close;
        SQL.Clear;
        SQL.Add(lsSQL);
        if lsFlag='O' then
        begin
          lsExec := '查询';
          try
            Open;
          except
            Cancel;
            DmSrv.adoSrv.RollbackTrans;
            lsSucc := '失败!';
            Result := 'F';
          end;
        end
        else if lsFlag='E' then
        begin
          lsExec := '执行';
          try
            ExecSQL;
          except
            Cancel;
            DmSrv.adoSrv.RollbackTrans;
            lsSucc := '失败!';
            Result := 'F';
          end;
        end
        else
        begin
          lsExec := '未知操作';
          lsSQL := lsStr;
          lsSucc := '失败!';
          Result := 'F';
          DmSrv.adoSrv.RollbackTrans;
        end;    TRY
          DmSrv.adoSrv.CommitTrans;
        except
        end;    ptrData := new(PMyOpr);
        ptrData^.OprInfo := lsExec+' SQL代码 '+lsSucc;
        ptrData^.OprSql := lsSQL;
        Main.lbOpr.Items.AddObject(ptrData^.OprInfo, TObject(ptrData));    Main.memSQL.Clear;
        Main.memSQL.Lines.Add(ptrData^.OprSql);
      end;
    end;initialization
      TComponentFactory.Create(ComServer, TRDmSrv,
        Class_RDmSrv, ciMultiInstance, tmApartment);
    end.★DmSrvP.pasunit DmSrvP;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, ADODB;type
      TDmSrv = class(TDataModule)
        adoSrv: TADOConnection;
        AdoQry: TADOQuery;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DmSrv: TDmSrv;implementation{$R *.DFM}end.
      

  5.   

    2、客户端源代码★YliaoClient.dprprogram YliaoClient;uses
      Forms,
      MainP in 'MainP.pas' {Main},
      DmCliP in 'DmCliP.pas' {DmCli: TDataModule};{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TMain, Main);
      Application.CreateForm(TDmCli, DmCli);
      Application.Run;
    end.★MainP.pasunit MainP;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, Buttons;type
      TMain = class(TForm)
        rgEXEC: TRadioGroup;
        gbSQL: TGroupBox;
        btnEXEC: TBitBtn;
        btnQuit: TBitBtn;
        memSQL: TMemo;
        gbResult: TGroupBox;
        dbgResult: TDBGrid;
        dbnResult: TDBNavigator;
        lblTime: TLabel;
        procedure btnEXECClick(Sender: TObject);
        procedure btnQuitClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Main: TMain;implementationuses DmCliP;{$R *.DFM}procedure TMain.btnEXECClick(Sender: TObject);
    var
      NowTime: TDateTime;
      TimeStr,PassWord: String;
    begin
      if DmCli.DCOMConn.Connected = false then
      begin
        ShowMessage('  提示:尚未连接远程DCOM服务器!  ');
        exit;
      end;
      if Trim(memSQL.Text) = '' then
      begin
        ShowMessage('  提示:尚未输入启动操作代码(SQL)!  ');
        exit;
      end;  NowTime := Now;
      TimeStr := FormatDateTime('YYYY-MM-DD HH:NN:SS',NowTime);
      lblTime.Caption := TimeStr;
      PassWord := '';  if MessageDlg('  警告:确定启动本次操作吗?  ',mtConfirmation,[mbYes,mbNo],0) <> mrYes then exit;  if InputQuery('密码验证:','请输入密码验证你是否具备操作权限...',PassWord) = false then exit;  if PassWord <> FormatDateTime('DDMMYYYY.SSNNHH',NowTime) then
      begin
        ShowMessage('   信息:操作权限不足,不能启动操作!  ');
        exit;
      end;  DmCli.cdsDSet.Close;
      case rgExec.ItemIndex of
      0:
        begin
          IF DmCli.cdsDSet.DataRequest('O'+memSQL.Text) = 'T' then
          begin
            gbResult.Caption := '客户端执行结果(成功):';
            try
              DmCli.cdsDSet.Open;
            except
            end;
          end
          else
          begin
            gbResult.Caption := '客户端执行结果(失败):';
          end;
        end;
      1:
        begin
          IF DmCli.cdsDSet.DataRequest('E'+memSQL.Text) = 'T' then
          begin
            gbResult.Caption := '客户端执行结果(成功):';
            try
              DmCli.cdsDSet.Open;
            except
            end;
          end
          else
          begin
            gbResult.Caption := '客户端执行结果(失败):';
          end;
        end;
      end;end;procedure TMain.btnQuitClick(Sender: TObject);
    begin
      Close;
    end;procedure TMain.FormShow(Sender: TObject);
    begin
      memSQL.Clear;
      lblTime.Caption := '';  DmCli.DCOMConn.Connected := False;
      try
        DmCli.DCOMConn.Connected := True;
      except
        ShowMessage('  信息:无法连接远程DCOM服务器!  ');
        Close; 
        exit;
      end;
    end;procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      DmCli.DCOMConn.Connected := False;
    end;end.★DmCliP.pasunit DmCliP;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, DBClient, MConnect;type
      TDmCli = class(TDataModule)
        DCOMConn: TDCOMConnection;
        cdsDSet: TClientDataSet;
        dsDSet: TDataSource;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DmCli: TDmCli;implementation{$R *.DFM}end.
      

  6.   

    也可采用接口函数。返回Data
    接口函数
    Query1.Open;
    DSP1.DataSet:=Query1;
    Result:=tmpDSP1.Data;客户端接收后。
    CDS1.Data:=Connection1.AppServer.MethodName;