三层结构中,通常哪些业务逻辑是放在中间层的? 请以一个用户登录作为实例! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先创建一个远程数据模块在VIEW->TYPE LIBRARY->建立一个方法mm远程数据模块创建时连接数据库 procedure Ttestapp.RemoteDataModuleCreate(Sender: TObject);beginADOConnection1.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);beginUserName:=edit1.text;PassWord:=edit2.text;DataModule2.APPS.mm(UserName,PassWord);ClientDataSet1.close;DataModule2.ClientDataSet1.Open;//剩下的就是你对返回数据集的处理了end; zdq801104(我很笨,但是我不傻!) : zdq801104(我很笨,但是我不傻!) : 你怎么老是这几句代码来回答别人啊!我看了十几贴了,你都这几行代码。 理论上讲所有的业务逻辑都因放在中间层, 这样才是完全的三层, 不过实际上有点难作到, 比方 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) 这类语法, 这个约束会传递补到客户机程序, 可惜的是不能传递数据库约束, 不过数据库约束仍然有效, 只不过多了一次网络数据包, 最好还在是客户机就把不正确的录入给封杀, 所以只好多写点了这类问题很多, 一时也想不起许多 comanche(太可怕) ( ):你是什么得到信誉分的我的信誉分什么越来越低,帮忙一下我都有结贴 用户登录例, 在服务器建立接口名为 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, 怎么判断操作允许我就不管了 写得有点复杂, 但我的代码都是这么作的, 不可靠之处是, 存根是明文发送的, 有了存根就可以冒冲已登录的用户, 不过总比用返回用户 ID 可靠得得多吧to chenminghong(cmh), 信誉分吗? 我也不是很清楚, 不结贴是会扣的, 加分就不知是什么原则了, 跟贴到问题结束可能是加的一个原则吧 我觉得一些操作要直接和数据库打交道的应该放在AppServer,那些不需要和数据库打交道的操作应该放在Client,减少数据传输,Client响应快。可能Client就不那么瘦了,看具体的应用场合了。 ActiveX dll注册问题 如何獲取多鍵鼠標的側側鍵消息~~! 请帮我来选选课程,谢谢! 怎么才能将数据存成Excel格式,要求能够将i边框,字体,合并单元格等信息都存进去 挪威的土豆请进 添加字段怎么出错了? 快来拿分啊~~很简单的问题哦~~~ 调用API函数GetComputerName出错??? 征求一个教学程序,用TreeView来实现资源管理器的目录列表功能。 综合问题,高手快来 下了个ODAC5,怎么安装老是出错啊? 一个关于 em_paste 的问题???请高手给予指导
在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;
你怎么老是这几句代码来回答别人啊!我看了十几贴了,你都这几行代码。
比方
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) 这类语法, 这个约束会传递补到客户机程序, 可惜的是不能传递数据库约束, 不过数据库约束仍然有效, 只不过多了一次网络数据包, 最好还在是客户机就把不正确的录入给封杀, 所以只好多写点了这类问题很多, 一时也想不起许多
我的信誉分什么越来越低,帮忙一下
我都有结贴
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, 怎么判断操作允许我就不管了