最简单的多层问题 ( 积分: 100 )

  • 主题发起人 主题发起人 如云
  • 开始时间 开始时间

如云

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在是将原来的简单C/S系统转换为多层分布式系统,以适应将来分布计算的需要
现就下列问题请教各位大虾,有的问题可能非常幼稚,见笑了 :)
1.怎样可以最快最简洁的迁移到多层系统上?除了Midas的方案之外还有没有其他更好的?
2.例如我想在客户端的登陆界面上显示本地区操作员列表,按以往做法,很简单,直接从数据库里取记录就行了,换到多层后以后该如何处理,是不是客户端一定不能写SQL语句,一切让应用服务器处理?
3.今天中午,我做了一个最简单的例子,感觉荆棘重重.先仿照Delphi提供的例子程序,应用服务器远程数据模块放了ADocoonection,AdoQuery,datasetprovider等,客户端数据模块上放了clientdataset和Dcomconection,属性都设置好了. 但执行的时候提示:invalid parameter
下面是出错的代码段:
client端: if not Dcomconection.Connected then
Dcomconection.Connected := True;
clientdataset.Close;
ClientDataSet.Open;
procedure TLoginFrm.ClientDataSet1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
OwnerData := VarArrayOf(['select * from users', NULL]);
end;

Server端:
procedure TSQLAppServer.DataSetProvider1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
try
ADOQ.Close;
ADOQ.SQL.Text := OwnerData[0];
if not VarIsNull(OwnerData[1]) and not VarIsEmpty(OwnerData[1]) then
begin
ADOQ.Open;
if not ADOQ.Locate(ADOQ.Fields[0].FieldName, OwnerData[1], []) then
raise Exception.Create('Record not found');
ADOQ.Next;
end;
finally
OwnerData := NULL;
end;
end;

 
我现在是将原来的简单C/S系统转换为多层分布式系统,以适应将来分布计算的需要
现就下列问题请教各位大虾,有的问题可能非常幼稚,见笑了 :)
1.怎样可以最快最简洁的迁移到多层系统上?除了Midas的方案之外还有没有其他更好的?
2.例如我想在客户端的登陆界面上显示本地区操作员列表,按以往做法,很简单,直接从数据库里取记录就行了,换到多层后以后该如何处理,是不是客户端一定不能写SQL语句,一切让应用服务器处理?
3.今天中午,我做了一个最简单的例子,感觉荆棘重重.先仿照Delphi提供的例子程序,应用服务器远程数据模块放了ADocoonection,AdoQuery,datasetprovider等,客户端数据模块上放了clientdataset和Dcomconection,属性都设置好了. 但执行的时候提示:invalid parameter
下面是出错的代码段:
client端: if not Dcomconection.Connected then
Dcomconection.Connected := True;
clientdataset.Close;
ClientDataSet.Open;
procedure TLoginFrm.ClientDataSet1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
OwnerData := VarArrayOf(['select * from users', NULL]);
end;

Server端:
procedure TSQLAppServer.DataSetProvider1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
try
ADOQ.Close;
ADOQ.SQL.Text := OwnerData[0];
if not VarIsNull(OwnerData[1]) and not VarIsEmpty(OwnerData[1]) then
begin
ADOQ.Open;
if not ADOQ.Locate(ADOQ.Fields[0].FieldName, OwnerData[1], []) then
raise Exception.Create('Record not found');
ADOQ.Next;
end;
finally
OwnerData := NULL;
end;
end;

 
要执行在clientdataset上执行sql语句,首先要设置datasetprovider的options中的poAllowcommandText为true
 
已经设置好了
 
dCOM只是接口就行
 
weianwen :应该如何操作
 
建议你看一看李维的那本<<delphi 5.x 分布式应用>>,一切都会明白的。
 
兄弟,是"Delphi 5.x 分布式多层应用电子商务篇"这本吗?
 
if not VarIsNull(OwnerData[1]) and not VarIsEmpty(OwnerData[1]) then
begin
//这部分得不到执行得
ADOQ.Open;
 
weekboy:这段是照抄Delphi的例子 呵呵
 
我说的是<<delphi 5.x分布式多层应用系统篇>>,和电子商务篇是姊妹篇,建议你先看系统篇,因为三层和两层有很大的不同,自己瞎琢磨只会多浪费许多时间,系统的看一本书,效果会“好极了”。
 
谢谢,小弟实在太菜了。我想在一到两天把C/S系统改为分布式的,可能不太现实吧。或许,还有没有其他快一点的办法?因为我原来的C/S系统要推广到全省应用,以现在程序的方式,数据库访问很慢很慢,四五十个客户端登上来要把数据库拖死了。另外问一下:如果不建虚拟局域网,和除过自己用Socket编程,还有什么办法,可以让分布在各地的客户端都能连接数据库
 
用VPN或者類似的軟件
 
把CS改成分布式,一般情况下,要重新设计并重新编写代码,除非原来面向对象的原则
贯彻得非常彻底
大量使用allowedCommandText:=true这种做法,不如不做。那不叫多层,只是从技术上
解决通讯问题。
比如,在cs中,select * from aTable,针对大表操作,不会有什么问题,但,对于三层
结构,你试试看,不死才怪!
 
张兄 你说的确实在理,但是我的进度很紧,你认为还有什么其他的措施可以弥补?C/S+VPN
的方式在实际运作中有没问题?
谢谢兄弟们的关注并给予我这么多的建议
 
如果任务紧,vpn是最好的解决方法
 
目前也只能这样,多层再慢慢改
谢谢大家,结帖了
分数大致分配了一下,可能分配不均,请见谅。
 
多人接受答案了。
 
实现多层应用以前,最好先看几本书,李维的算不错,但里面也可能有些误导的东西
 
后退
顶部