请以一个用户登录作为实例!

解决方案 »

  1.   

    先创建一个远程数据模块
    在VIEW->TYPE LIBRARY->建立一个方法mm
    远程数据模块创建时连接数据库 
    procedure Ttestapp.RemoteDataModuleCreate(Sender: TObject);
    begin
    ADOConnection1.ConnectionString :=' Provider=SQLOLEDB.1;'+
        'Persist Security Info=False;User ID='+GetRegInfo(3)+';Password='+GetRegInfo(4)+';'+
        'Initial Catalog='+GetRegInfo(2)+';Data Source='+GetRegInfo(1);
    end;定义方法的数据操作
    procedure Ttestapp.mm(UserName,PassWord);
    begin
     ADODataSet1.Close;
     ADODataSet1.CommandText:='select Legal_power from UserManage where UserName='''+UserName+''' and PassWord='''+PassWord+'''';
     ADODataSet1.Open;
    end;客户端调用:procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    UserName:=edit1.text;
    PassWord:=edit2.text;
    DataModule2.APPS.mm(UserName,PassWord);
    ClientDataSet1.close;
    DataModule2.ClientDataSet1.Open;
    //剩下的就是你对返回数据集的处理了
    end;
      

  2.   

    zdq801104(我很笨,但是我不傻!) :
      

  3.   

    zdq801104(我很笨,但是我不傻!) :
      你怎么老是这几句代码来回答别人啊!我看了十几贴了,你都这几行代码。
      

  4.   

    理论上讲所有的业务逻辑都因放在中间层, 这样才是完全的三层, 不过实际上有点难作到, 
    比方 
    1. 你能肯定所有的 ClientDataSet(CDS) 都没有 Add all fields 吗?
        这么作的好处是可以在服务器上控制Fields 的DisplayLabel, DisplayFormat等等等, 在服务器上有设定, DataSetProvider(DSP), 包含字段信息
    2. 你有在客户机代码中 if CDS.FieldByName('...').Value <> xxx then ShowMessage(...) 吗?
        最好是不要这么作的, 这也是业务逻辑的一种, 决定客户机不能录入什么数据, 在服务器这边的 Field属性有自定义约束和出错提示信息, 里面可以写 (FieldName <> Value) and (Field is not NULL) 这类语法, 这个约束会传递补到客户机程序, 可惜的是不能传递数据库约束, 不过数据库约束仍然有效, 只不过多了一次网络数据包, 最好还在是客户机就把不正确的录入给封杀, 所以只好多写点了这类问题很多, 一时也想不起许多
      

  5.   

    comanche(太可怕) ( ):你是什么得到信誉分的
    我的信誉分什么越来越低,帮忙一下
    我都有结贴
      

  6.   

    用户登录例, 在服务器建立接口名为 ISecurity 的模块, 中有方法名为 
    function Login(UserName, Password: WideString): string;
    begin
      if 查看用户信息正确 then
      begin
        result := 生成存根 GUID
        LogLogin(result, UserID); 这个实现方法有多种以下说明
      end;
    end;
    返回一个 GUID, 是自动成生的, 作为客户登录存根, 以后的方法都要用这个 GUID 作为登录凭证, 实现的办法不难在其它模块中设一个属性, LoginStub: string; 在设用这个模块前要设 LoginStub 成客户机存根ISecurity中加个方法, 这个其它模块就非常频繁的要调用了, 像这样调用CreateCOMObject(ISecurity对像).CheckOperation(LoginStub, OperationID)
    pricedure CheckOperation(Stub: string, OperatoionID: Integer);
    begin
      LoginUserID := Lookup存根表得到
      if 检查是否有权操作 OperationID 中指明的操作 then
        raise Exception.Create(...);
    end;问题就在实现存根上了
    可以在数据库中建一个表 LoginName, Stub, LogTime, 
    ISecurity Login 中 insert into log(LoginName, Stub, LogTime)
    ISecurity CheckOperation 中 select * from log where Stub = LoginStub, 怎么判断操作允许我就不管了
      

  7.   

    写得有点复杂, 但我的代码都是这么作的, 不可靠之处是, 存根是明文发送的, 有了存根就可以冒冲已登录的用户, 不过总比用返回用户 ID 可靠得得多吧to  chenminghong(cmh), 信誉分吗? 我也不是很清楚, 不结贴是会扣的, 加分就不知是什么原则了, 跟贴到问题结束可能是加的一个原则吧
      

  8.   

    我觉得一些操作要直接和数据库打交道的应该放在AppServer,那些不需要和数据库打交道的操作应该放在Client,减少数据传输,Client响应快。可能Client就不那么瘦了,看具体的应用场合了。