delphi 三层的一些问题

likeyrain 2012-07-05 05:44:56
大家好:
请教一下,delphi做三层
服务器端:remote data module+ADOConnection+ADOQuery+DataSetProvider
客户端:DCOMConnection+ClientDataSe

想请教一下:这样做,
1.服务器端怎样查看有多少个客户端连接,在必要的时候,怎样踢掉个别客户端
2.有多个客户端连接的时候,修改同一记录的可能性,怎样解决啊?
...全文
697 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenxizx 2012-10-12
  • 打赏
  • 举报
回复
不知道现在楼主解决了这个问题没有,如果解决的话,可否将解决方案发布一下,让大家学习一下!
chenxizx 2012-10-12
  • 打赏
  • 举报
回复
呵呵,我也在研究这个问题,我还试了尝试关闭自己动态的开启或关闭服务端,但均未成功!
lyhoo163 2012-07-27
  • 打赏
  • 举报
回复
编辑一个方法,更新数据后,返回一个代码。不就知道,是否保存成功了吗?
likeyrain 2012-07-24
  • 打赏
  • 举报
回复
另外,ClientDataSet提交的时候,有同时修改同一记录的时候,后者是提交不成功,但不会有报错或者提示什么的
但会有的个ChangeCount的属性,这个其实是返回没有修改成功的记录条数,可以判定这个值,为0的时候就是保存成功,如果非0就是保存失败的记录数
likeyrain 2012-07-24
  • 打赏
  • 举报
回复
还是决定外加一socket连接去管理
likeyrain 2012-07-23
  • 打赏
  • 举报
回复
唉。。。
我看见佛 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 的回复:]

以前我也用delphi的三层控件写了个操纵远程服务器的程序,后来用户反映,他们明明录了或修改了数据,后来重新查询就发现数据没有保存成功,程序没有任何错误提示,我意识到可能是这些控件有问题,于是就放弃了用delphi的三层控件
[/Quote]…………………………
yifawu100 2012-07-23
  • 打赏
  • 举报
回复
以前我也用delphi的三层控件写了个操纵远程服务器的程序,后来用户反映,他们明明录了或修改了数据,后来重新查询就发现数据没有保存成功,程序没有任何错误提示,我意识到可能是这些控件有问题,于是就放弃了用delphi的三层控件
yifawu100 2012-07-23
  • 打赏
  • 举报
回复
我那个服务器是用C#写的,在delphi下写比较麻烦,.net的对象序列化很好用,delphi不知有没有这个功能?
likeyrain 2012-07-23
  • 打赏
  • 举报
回复
还有其它答案不?
likeyrain 2012-07-19
  • 打赏
  • 举报
回复
写服务器控件?
likeyrain 2012-07-18
  • 打赏
  • 举报
回复
我试了,也没成功
yifawu100 2012-07-18
  • 打赏
  • 举报
回复
delphi 的三层控件不好,数据没保存成功都没提示,很烦,自己写了个服务器解决了
likeyrain 2012-07-18
  • 打赏
  • 举报
回复
好的,谢谢,继续尝试
lyhoo163 2012-07-18
  • 打赏
  • 举报
回复
1、试了一天,可以上线增加一个有关“远程用户”的“计算机名”“IP地址”“用户名”“上线时间”(LISTVIEW控件)等信息。如“远程用户”下线,自动关闭一个用户。
2、但是,当“远程用户”非正常下线,就不能关闭该用户。因而,需要检测,踢除故障用户。
3、如果要强行关闭某“用户”,找不到关闭的入口方法。我试过了,枚举线程不行,枚举VCL也不行,网上参考资料有限。RemoteDataModule是COM接口方式,新增一个“实体”,资料不多,有点难。
4、建议通过模拟远程关闭方式,即模拟远程执行语句:
DataModule1.SocketConnection1.Connected:=False;
因为远程关闭,就是执行该语句,服务器响应接口在哪里?
5、试试服务器中:CoDisconnectObject(DataModule1.ComObject,0);
但找不到DataModule1.ComObject。

期待高手指点!

lyhoo163 2012-07-17
  • 打赏
  • 举报
回复
服务器响应客户端的动态RemoteDataModule,一般是单独为每个客户端建立一个。因此,可以将正在上线的客户踢除。
lyhoo163 2012-07-17
  • 打赏
  • 举报
回复
要想踢人的话,首先要获得服务器响应客户端的动态RemoteDataModule的句柄,但是几经尝试,未成功。

如有能者,可提供。
likeyrain 2012-07-16
  • 打赏
  • 举报
回复
嗯,这个只能记数?如果想踢人的话,好象不行吧?
lyhoo163 2012-07-14
  • 打赏
  • 举报
回复
在服务中,只要有人上线,就会激发一个动态连接。设一个计数器(FClientCount上线数)。
我的代码如下:自己参考做吧!

1、
procedure TTServer.RemoteDataModuleCreate(Sender: TObject);
begin
ADOCon.Connected:=False;
// ADOCon.ConnectionString:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=¾´ÀÏÔºÊý¾Ý¹ÜÀí;Data Source=LYHOO2';
ADOCon.ConnectionString:=ConnectionString;
ADOCon.Connected:=True;
FClientCount:= FClientCount+1;
end;

2、
procedure TTServer.RemoteDataModuleDestroy(Sender: TObject);
begin
FClientCount:= FClientCount-1;
end;

3、
procedure TServerFrm.Timer1Timer(Sender: TObject);
begin
StatusBar1.Panels[3].Text:='在线: '+ IntToStr(FClientCount);
end;
likeyrain 2012-07-14
  • 打赏
  • 举报
回复
还有高人能指点一下不
加载更多回复(24)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧