多层设计中的关键是什么?我有几个关于COM+的小问题不知有人能给予解答否?

westdiamond 2003-10-09 01:57:00
我用COM+进行数据通讯时,在客户端用这种方式来封装数据库中的每一条记录后发送到服务端,不知道有没有更好的方式?

我是这样做的:
VAR
fstr : variant ;
begin
fstr := varArrayCreate([0,2,0,7], varVariant);
.......
调用服务端并把fstr传送到服务端进行处理。。
end

一、如果要发送N条是不是用XML会方便点,那么XML通过什么协议或者方式来进行客户端的与服务器数据传输(就像在服务端的数据表转换成OleVariant后传输到客户端一样)?

二、为什么我的COM+在Internet上进行服务通讯时,服务端和客户端的系统用户名和密码一定要一样~~?难道是COM+本身所具有的天性?这样很不安全啊~

三、2000和98之间能不能用COM+来进行互通(在局域网和Inter网中都可以吗?)?我只试过2000与2000之间的互通~~

三、用WINSOCK通讯起来是不是没DCOM和COM+那样有很多的限制?哪位大哥有这方面的资料,小弟拜谢了~ :)

...全文
19 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
frogshero 2003-10-12
  • 打赏
  • 举报
回复
学习ing
westdiamond 2003-10-12
  • 打赏
  • 举报
回复
UP一下~ :)
jun_01 2003-10-11
  • 打赏
  • 举报
回复
学习ing
westdiamond 2003-10-11
  • 打赏
  • 举报
回复
小弟在两天也在看书,发现慢慢的有些理解了~ 不过还在考虑在不同情况下,采取何种方式(信息传递的方式)比较合适~
就好像你们说DCOM、COM+不能通过防火墙,那么一般的TCP/IP方式传递信息是否适合在多层数据库上的使用?
还有,比如说2台分别在不同服务器后的客户端是否可以用 ClientDataSet来传递信息?
各位大哥如果觉得我的问题多,小弟可以重新开个新讨论区~~ 只是小弟想把这些联系在一起比较好一些~~ 拜谢各位达人了~ :)
westdiamond 2003-10-10
  • 打赏
  • 举报
回复
果子兄啊~ 哈哈~
多谢多谢~
猛禽 2003-10-10
  • 打赏
  • 举报
回复
基本上Miracle(秋水长天)老大说的是不会错的。

至于 rwdx(任我独行之浪迹天涯) 则明显是误导:首先:ClientDataSet也是基于Variant的,而且XML的PARSE是一件非常费事的事情,加上WEBSERVICE通过HTTP带来的损失,其性能比VARIANT下降不止十倍。
WGYKING 2003-10-10
  • 打赏
  • 举报
回复
嘻嘻
  • 打赏
  • 举报
回复
多层设计中的关键是解决两层解决不了的问题。
多层体系扩展性要强,功能模块化。
另外Miracle(秋水长天) 说得很对。特别是第二条,我门的系统就是这样做的。
eastliangliang 2003-10-09
  • 打赏
  • 举报
回复
测试代码
procedure TForm1.Button1Click(Sender: TObject);
var
ArrayWithXML:TArrayWithXML;
s,a,b:WideString;
begin
ArrayWithXML := TArrayWithXML.Create;
try
ArrayWithXML.Add('id','int','000001'); //添加测试数据
s := ArrayWithXML.GetValue; //取出XML字符串,可以当参数传给服务器
ArrayWithXML.Clear; //变量清空自己的字符串,为了看测试效果
ArrayWithXML.SetValue(s); //给变量赋值,可以在服务器上放这样一个变量解析
ArrayWithXML.GetByFieldName('id',a,b); //根据第一个参数取出后两个的值
showmessage(b); //打出来看看对不对
finally
ArrayWithXML.Free;
end;
end;
eastliangliang 2003-10-09
  • 打赏
  • 举报
回复
心情不好,郁闷中……,散给楼主点东东吧:XML的三维数组,字段不可为空,没用的随便写个东西占位就行啦。欢迎楼上的各位星星帮我改进:)
unit UnitArrayWithXML;

interface

uses
Mtsobj, Mtx, ComObj, ActiveX, StdVcl,XMLDoc, XMLIntf,
xmldom, msxmldom, Classes;

type
TArrayWithXML = class
private
Owner:TComponent;
myxmldoc:Txmldocument;
myxmlNode:Ixmlnode;
insertnode:Ixmlnode;
public
procedure Add(const fieldName, fieldProperty, fieldValue: WideString); safecall;
procedure GetByIndex(index: Integer; out fieldName, fieldProperty,
fieldValue: WideString); safecall;
procedure GetByFieldName(const fieldName: WideString;
out fieldProperty, fieldValue:WideString) safecall;
procedure SetValue(const inData: WideString); safecall;
function GetValue: WideString; safecall;
function GetNodeCount: Integer; safecall;
procedure Clear; safecall;
constructor Create;
destructor Destroy;override;
end;
implementation
uses ComServ, SysUtils;

procedure TArrayWithXML.Add(const fieldName, fieldProperty, fieldValue: WideString);
begin
//if fieldValue = '' then exit;
try
self.insertnode := self.myxmlNode.AddChild(LowerCase(fieldName));
if fieldvalue <> '' then
begin
self.insertnode.Text := fieldValue;
self.insertnode.Attributes['fieldProperty'] := fieldProperty;
end
else begin
self.insertnode.Text := 'Null';
self.insertnode.Attributes['fieldProperty'] := 'int';
end;
except
raise exception.Create('Error in Add to XML!向XML添加数据错误!');
end;
end;

procedure TArrayWithXML.GetByIndex(index: Integer; out fieldName, fieldProperty,
fieldValue: WideString);
begin
try
self.insertnode := self.myxmlNode.ChildNodes.Get(index);
fieldName := self.insertnode.NodeName;
fieldValue := self.insertnode.NodeValue;
if self.insertnode.HasAttribute('fieldProperty') then
fieldProperty := self.insertnode.Attributes['fieldProperty'];
except
raise exception.Create('Error in GetByIndex!从XML中读数据错误!');
end;
end;

procedure TArrayWithXML.GetByFieldName(
const fieldName: WideString;out fieldProperty, fieldValue:WideString);
begin
fieldValue := self.myxmlNode.ChildNodes[LowerCase(fieldName)].Text;
if self.myxmlNode.HasAttribute('fieldProperty') then
fieldProperty := self.myxmlNode.ChildNodes[LowerCase(fieldName)].Attributes['fieldProperty'];
end;

procedure TArrayWithXML.SetValue(const inData: WideString);
begin
try
self.myxmldoc.Active := false;
self.myxmldoc.XML.Text := inData;
self.myxmldoc.Active := true;
myxmlnode := myxmldoc.DocumentElement;
except
raise exception.Create('Error in SetValue!给XML赋值错误!');
end;
end;

function TArrayWithXML.GetValue: WideString;
begin
result := self.myxmldoc.XML.Text;
end;

function TArrayWithXML.GetNodeCount: Integer;
begin
result := myxmlnode.ChildNodes.Count;
end;

destructor TArrayWithXML.Destroy;
begin
Owner.Free;
inherited;
end;

constructor TArrayWithXML.Create;
begin
inherited;
Owner := TComponent.Create(nil);
self.myxmldoc := Txmldocument.Create(self.Owner);
with myxmldoc.XML do
begin
add('<?xml version="1.0" encoding="gb2312"?>');
add('<VariantArray></VariantArray>');
end;
myxmldoc.Active := true;
myxmlnode := myxmldoc.DocumentElement;
end;

procedure TArrayWithXML.Clear;
begin
self.myxmldoc.XML.Clear;
with myxmldoc.XML do
begin
add('<?xml version="1.0" encoding="gb2312"?>');
add('<VariantArray></VariantArray>');
end;
myxmldoc.Active := true;
myxmlnode := myxmldoc.DocumentElement;
end;

end.
Miracle 2003-10-09
  • 打赏
  • 举报
回复
一、使用MIDAS,封装数据库记录会容易很多,不用自己手工创建olevariant数据封包,直接使用TClientDataset.Data属性即可(如何将Dataset中的数据抓入本地ClientDataset,已经有太多的文章,不用说了)。如果想使用XML来包装数据,也可以用ClientDataset,读取其XMLData属性即可。Data或者XMLData作为函数结果返回到客户端以后,用一个ClientDataset装入即可。

二、不推荐直接在Internet上使用COM+。如果确要使用,可以使用CIS,但更好的方式是使用SOAP协议将COM+的功能代理出来,客户端连接这个WebService,间接调用COM+。

三、Win98只能支持MTS,不推荐作为COM+应用服务器程序的宿主,但作为域成员访问Win2000上的COM+应用。

四、如果想用WinSock的解决方案,可以试试看Asta或者RemObjects
rwdx 2003-10-09
  • 打赏
  • 举报
回复
使用variant 数据类型会影响性能,建议使用TClientDataset封装XML数据进行传递或使用WEBSERVICE
Miracle 2003-10-09
  • 打赏
  • 举报
回复
如果有一点耐心,基本上都可以用ClientDataset搞定,特殊的用XML也就可以了。如果你没什么基础的话就不大好讲了,来我的网站玩玩吧,我做了一个通用的实现(服务器)。
--------------------
welcome to http://www.ezService.org/
westdiamond 2003-10-09
  • 打赏
  • 举报
回复
听了Miracle(秋水长天)的解说,是不是所有网络中的数据(表、字段、记录、XML……)都可以由TClientDataset来解决~?
使用SOAP协议后,需要在客户端安装些什么吗?小弟从未用过SOAP~
多谢各位的解答~ :)
leapmars 2003-10-09
  • 打赏
  • 举报
回复
1、MIDAS、XML 等等

2、COM/DCOM/COM+ 的底层 RPC 协议很难穿越防火墙,不推荐应用于 Internet。

3、用 Socket 通讯,可以参考 TSocketConnection、 Scktsrvr.exe 的实现。
westdiamond 2003-10-09
  • 打赏
  • 举报
回复
哪位猩猩能给予帮助~ 小弟在这拜谢了~ :)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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