我用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+那样有很多的限制?哪位大哥有这方面的资料,小弟拜谢了~ :)
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+那样有很多的限制?哪位大哥有这方面的资料,小弟拜谢了~ :)
多层体系扩展性要强,功能模块化。
另外Miracle(秋水长天) 说得很对。特别是第二条,我门的系统就是这样做的。
使用SOAP协议后,需要在客户端安装些什么吗?小弟从未用过SOAP~
多谢各位的解答~ :)
--------------------
welcome to http://www.ezService.org/
unit UnitArrayWithXML;interfaceuses
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.
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;
就好像你们说DCOM、COM+不能通过防火墙,那么一般的TCP/IP方式传递信息是否适合在多层数据库上的使用?
还有,比如说2台分别在不同服务器后的客户端是否可以用 ClientDataSet来传递信息?
各位大哥如果觉得我的问题多,小弟可以重新开个新讨论区~~ 只是小弟想把这些联系在一起比较好一些~~ 拜谢各位达人了~ :)