我用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+那样有很多的限制?哪位大哥有这方面的资料,小弟拜谢了~ :) 

解决方案 »

  1.   

    一、使用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
      

  2.   

    多层设计中的关键是解决两层解决不了的问题。
    多层体系扩展性要强,功能模块化。
    另外Miracle(秋水长天) 说得很对。特别是第二条,我门的系统就是这样做的。
      

  3.   

    1、MIDAS、XML 等等2、COM/DCOM/COM+ 的底层 RPC 协议很难穿越防火墙,不推荐应用于 Internet。3、用 Socket 通讯,可以参考 TSocketConnection、 Scktsrvr.exe 的实现。
      

  4.   

    听了Miracle(秋水长天)的解说,是不是所有网络中的数据(表、字段、记录、XML……)都可以由TClientDataset来解决~?
    使用SOAP协议后,需要在客户端安装些什么吗?小弟从未用过SOAP~ 
    多谢各位的解答~  :)
      

  5.   

    如果有一点耐心,基本上都可以用ClientDataset搞定,特殊的用XML也就可以了。如果你没什么基础的话就不大好讲了,来我的网站玩玩吧,我做了一个通用的实现(服务器)。
    --------------------
    welcome to http://www.ezService.org/
      

  6.   

    使用variant 数据类型会影响性能,建议使用TClientDataset封装XML数据进行传递或使用WEBSERVICE
      

  7.   

    心情不好,郁闷中……,散给楼主点东东吧:XML的三维数组,字段不可为空,没用的随便写个东西占位就行啦。欢迎楼上的各位星星帮我改进:)
    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.
      

  8.   

    测试代码
    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;
      

  9.   

    基本上Miracle(秋水长天)老大说的是不会错的。至于 rwdx(任我独行之浪迹天涯) 则明显是误导:首先:ClientDataSet也是基于Variant的,而且XML的PARSE是一件非常费事的事情,加上WEBSERVICE通过HTTP带来的损失,其性能比VARIANT下降不止十倍。
      

  10.   

    小弟在两天也在看书,发现慢慢的有些理解了~ 不过还在考虑在不同情况下,采取何种方式(信息传递的方式)比较合适~  
    就好像你们说DCOM、COM+不能通过防火墙,那么一般的TCP/IP方式传递信息是否适合在多层数据库上的使用?
    还有,比如说2台分别在不同服务器后的客户端是否可以用 ClientDataSet来传递信息?
    各位大哥如果觉得我的问题多,小弟可以重新开个新讨论区~~ 只是小弟想把这些联系在一起比较好一些~~ 拜谢各位达人了~ :)