Delphi 中三层的概念已出来好久了。
Delphi 3.0 时就用了吧。
但真正在实际中用的人比较少
也有大多用是用了三层。不过也只是用两层的思想或者用文件型数据库的思想来做三层的。三层的基本思想就是分层。而那些所有在客户端向 AppServer 发 SQL 命令的全是“伪三层”所以本人真心寻师,不吝千金,只求良师指点迷津
Delphi 3.0 时就用了吧。
但真正在实际中用的人比较少
也有大多用是用了三层。不过也只是用两层的思想或者用文件型数据库的思想来做三层的。三层的基本思想就是分层。而那些所有在客户端向 AppServer 发 SQL 命令的全是“伪三层”所以本人真心寻师,不吝千金,只求良师指点迷津
2:客户端使用数据库别名调用数据,及传递请求参数(不固定)
3:中间层根据客户端的请求进行SQL语句组装与初始化(如请求条件)
4:提交时传递TClientDataSet.Delta给中间层,中间层进行解释并判断数据有效性执行更新,更新后将错误返回客户端,客户根据返回结果合并Log,并将错误显示给用户*客户端所有TClientDataSet都不连TDataSetProvider控件,只用TStockConnection控件调用中间层接口完成数据的获取与提交工作,中间层仅需要两个TDataSetProvider与一个TADOQuery与二个TAdoStoreProcedure控件即可,其它的全为解释执行程序(才1400来行)
缺点:现在遇到一个问题,通过Internet(动态IP 仅开一个端口)访问中间层的时候,不能使用TDataSetProvider控件 VPN则没问题 其它一切正常
没看过多少书(书中的太麻烦了,个人认为不太适合做大型系统),所以不知这是否叫三层呢???
应用程序服务器:
先创建一个远程数据模块
在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;
begin
ADODataSet1.Close;
ADODataSet1.CommandText:='select * from MaintManView';
ADODataSet1.Open;
end;客户端调用:procedure TForm1.BitBtn1Click(Sender: TObject);
begin
DataModule2.APPS.mm;
ClientDataSet1.close;
DataModule2.ClientDataSet1.Open;
end;接下来就是你对数据集的处理了
我们在开发大系统时多半用以上模式.
开发起来真的是很麻烦,还不如用ASP呢
有没有方便的方法?
1.慨念模糊:
并不1是客户端不能发送SQL语句,因为简单的查询可以用客户端来完成!!中间层是用来减轻服务器的工作的,同时封装业务逻辑的!!它不是万能的!!数据库服务器,可以向中间层提供服务,三个层次不是各自独立的!!!
2。层次不明显:
既然独立了中间层,为什么要大量使用存储过程,触发器等数据库的服务!!当然不是说不能用,要
少用,才能达到最好的效果!!不然要中间层来干什么!!
3。CLIENTDATASET或MIDAS《》分布式!!!
不要以为独立了中间层就是分布式了,,那还早呢!!!以上只是在下愚论,,,有得罪之处,请各位包含!!
服务器:
function MSearch(const PSql: WideString): OleVariant;
begin
AQSearch.Close;
AQSearch.SQL.Clear;
AQSearch.SQL.Text:=trim(Psql);
AQSearch.Open;
if not AQSearch.IsEmpty then
begin
Result:=DspSearch.Data;
end else
begin
Result:=Null;
end;
AQSearch.Close;
end;客户端:
Function OpenDb(ViewTable,State_Num:String):Boolean;
Var
Sql:String;
Datas:Olevariant;
begin
Result:=False;
Sql:='Select * From '+ViewTable+' Where State_Num='+trim(STate_Num);
datas:=Null;
try
datas:=ClientDm.ATest.MSearch(Sql);
If Not VarisNull(Datas) Then
begin
CdsData.Data:=datas;
CdsData.Open;
Result:=true;
end;
except
end;
end;
请楼下继续发言,发表看法!
IBM MQ, BEA Texido, 国产的还有TongLink 系列。
自己作可就比较困难了,还有一个值得不值得的问题, 风险很大。
業務實體層 數據訪問層 業務規則層 業務外觀層 用戶界面層
這是一個步步向上的層次 下層的不能訪問上層,
目前, 3層的焦點主要 數據量的控制上, 主要體現在數據的壓縮訪法,
多線程的共同訪問(主要體現在利用dll的實現) 還有一點是如何跨平台
的問題, 所傳輸的報文應採用xml這個世界通用的方式了
1。会造成程序运行缓慢;
2。跟踪不了业务;
3。随着数据量的增大,程序会崩溃;
以上只是自己在开发中的体会,纯属一面之辞,得罪处,见谅
希望,继续交流!!!