1.Delphi编的SOAP/Web Service系统
2.编译成CGI服务器端程序
3.服务器端中有连接数据库的模块
4.SQL状Server 2000数据库
5.服务器返回
’Access violation at address 004C41A0 in module 'pCGINetServer.exe'. Read of address 00000300‘ 的错误

解决方案 »

  1.   

    raise Exception.Create('通过提供的信息不能确定错误!');
      

  2.   

    我试了,只是打开表就就错了怎么都打不开。还有我将数据模块加入工程时,运行时出现'Only one data module per application'错误。
    我在客户端是运行不了,根本无法调用。于是我用建立对象的方法:    DataModule := TDataModule1.Create(nil);将数据模块单元从工程的auto-create-forms扔到available-forms就可以编译运行了。服务端是这样写的(实现单元):
    { Invokable implementation File for TOpenTable which implements IOpenTable }unit OpenTableImpl;interfaceuses InvokeRegistry, Types, XSBuiltIns, OpenTableIntf, ADODB;type  { TOpenTable }
      TOpenTable = class(TInvokableClass, IOpenTable)
      public
        function OpenTable(StrSql : String): Boolean;
      end;implementationuses Unit2;function TOpenTable.OpenTable(StrSql : String): Boolean;
    var
      SqlStr : String;
    begin
      try
        with DataModule2.adsSend_List do
        begin
          Close;
          CommandText := 'select * from  Send_List';
          Open;
          Result := True;
        end;
      except
        Result := False;
      end;
    end;initialization
      { Invokable classes must be registered }
      InvRegistry.RegisterInvokableClass(TOpenTable);end.接口单元:
    { Invokable interface IOpenTable }unit OpenTableIntf;interfaceuses InvokeRegistry, Types, XSBuiltIns, ADODB;type  { Invokable interfaces must derive from IInvokable }
      IOpenTable = interface(IInvokable)
      ['{CF9DFFB3-24AA-4850-A35A-124CC20C172F}']    function OpenTable(StrSql : String): Boolean;
        { Methods of Invokable interface must not use the default }
        { calling convention; stdcall is recommended }
      end;implementationinitialization
      { Invokable interfaces must be registered }
      InvRegistry.RegisterInterface(TypeInfo(IOpenTable));end.
    { Invokable interface IOpenTableService }工程文件(pOpenTable.dpr):
    program pOpenTable;{$APPTYPE CONSOLE}uses
      WebBroker,
      CGIApp,
      uMW in 'uMW.pas' {WebModule1: TWebModule},
      OpenTableImpl in 'OpenTableImpl.pas',
      OpenTableIntf in 'OpenTableIntf.pas',
      Unit2 in 'Unit2.pas' {DataModule2: TDataModule};var
      DataModule2 : TDataModule2;{$R *.RES}begin
      Application.Initialize;
      DataModule2 := TDataModule2.Create(nil);
      Application.CreateForm(TWebModule1, WebModule1);
      Application.CreateForm(TDataModule2, DataModule2);
      Application.Run;
    end.Web Module:
    unit uMW;interfaceuses
      SysUtils, Classes, HTTPApp, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
      SOAPHTTPDisp, WebBrokerSOAP;type
      TWebModule1 = class(TWebModule)
        HTTPSoapDispatcher1: THTTPSoapDispatcher;
        HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
        WSDLHTMLPublish1: TWSDLHTMLPublish;
        procedure WebModule1DefaultHandlerAction(Sender: TObject;
          Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      WebModule1: TWebModule1;implementation{$R *.DFM}procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    begin
      WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
    end;end.数据模块:
    unit Unit2;interfaceuses
      SysUtils, Classes, Provider, DB, ADODB;type
      TDataModule2 = class(TDataModule)
        aconnNetServer: TADOConnection;
        adsReceive_List: TADODataSet;
        dspReceive_List: TDataSetProvider;
        adsLink_Log: TADODataSet;
        adsSend_List: TADODataSet;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DataModule2: TDataModule2;implementation{$R *.dfm}end.
     
      

  3.   

    上面的Web模块:
    unit uMW;interfaceuses
      SysUtils, Classes, HTTPApp, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
      SOAPHTTPDisp, WebBrokerSOAP;type
      TWebModule1 = class(TWebModule)
        HTTPSoapDispatcher1: THTTPSoapDispatcher;
        HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
        WSDLHTMLPublish1: TWSDLHTMLPublish;
        procedure WebModule1DefaultHandlerAction(Sender: TObject;
          Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      WebModule1: TWebModule1;implementation{$R *.DFM}procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    begin
      WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
    end;end.还请大侠帮忙啊!
      

  4.   

    再写一遍服务端是这样写的
    //--------------------------------------------------------------------------
    //(实现单元):
    { Invokable implementation File for TOpenTable which implements IOpenTable }unit OpenTableImpl;interfaceuses InvokeRegistry, Types, XSBuiltIns, OpenTableIntf, ADODB;type  { TOpenTable }
      TOpenTable = class(TInvokableClass, IOpenTable)
      public
        function OpenTable(StrSql : String): Boolean;
      end;implementationuses Unit2;function TOpenTable.OpenTable(StrSql : String): Boolean;
    var
      SqlStr : String;
    begin
      try
        with DataModule2.adsSend_List do
        begin
          Close;
          CommandText := 'select * from  Send_List';
          Open;
          Result := True;
        end;
      except
        Result := False;
      end;
    end;initialization
      { Invokable classes must be registered }
      InvRegistry.RegisterInvokableClass(TOpenTable);end.//--------------------------------------------------------------------------
    //接口单元:
    { Invokable interface IOpenTable }unit OpenTableIntf;interfaceuses InvokeRegistry, Types, XSBuiltIns, ADODB;type  { Invokable interfaces must derive from IInvokable }
      IOpenTable = interface(IInvokable)
      ['{CF9DFFB3-24AA-4850-A35A-124CC20C172F}']    function OpenTable(StrSql : String): Boolean;
        { Methods of Invokable interface must not use the default }
        { calling convention; stdcall is recommended }
      end;implementationinitialization
      { Invokable interfaces must be registered }
      InvRegistry.RegisterInterface(TypeInfo(IOpenTable));end.
    { Invokable interface IOpenTableService }//--------------------------------------------------------------------------
    //工程文件(pOpenTable.dpr):
    program pOpenTable;{$APPTYPE CONSOLE}uses
      WebBroker,
      CGIApp,
      uMW in 'uMW.pas' {WebModule1: TWebModule},
      OpenTableImpl in 'OpenTableImpl.pas',
      OpenTableIntf in 'OpenTableIntf.pas',
      Unit2 in 'Unit2.pas' {DataModule2: TDataModule};var
      DataModule2 : TDataModule2;{$R *.RES}begin
      Application.Initialize;
      DataModule2 := TDataModule2.Create(nil);
      Application.CreateForm(TWebModule1, WebModule1);
      Application.CreateForm(TDataModule2, DataModule2);
      Application.Run;
    end.//--------------------------------------------------------------------------
    //Web Module:
    unit uMW;interfaceuses
      SysUtils, Classes, HTTPApp, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
      SOAPHTTPDisp, WebBrokerSOAP;type
      TWebModule1 = class(TWebModule)
        HTTPSoapDispatcher1: THTTPSoapDispatcher;
        HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
        WSDLHTMLPublish1: TWSDLHTMLPublish;
        procedure WebModule1DefaultHandlerAction(Sender: TObject;
          Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      WebModule1: TWebModule1;implementation{$R *.DFM}procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    begin
      WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
    end;end.
    //--------------------------------------------------------------------------
    //数据模块:
    unit Unit2;interfaceuses
      SysUtils, Classes, Provider, DB, ADODB;type
      TDataModule2 = class(TDataModule)
        aconnNetServer: TADOConnection;
        adsReceive_List: TADODataSet;
        dspReceive_List: TDataSetProvider;
        adsLink_Log: TADODataSet;
        adsSend_List: TADODataSet;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DataModule2: TDataModule2;implementation{$R *.dfm}end.
      

  5.   

    出现这一句'Only one data module per application'是因为你创建了两次TDataModule2。
    DataModule := TDataModule2.Create(nil);这一句可以去掉,因为你将数据模块单元从工程的auto-create-forms扔到available-forms就已经自动创建一个DataModule的实例了。
      

  6.   

    哦我知道了真正的原因:
     CSDN - 文档中心 - Delphi       
      
    标题     Web 应用的执行过程 -- 谈谈 WAD/CGI/ISAPI 的区别    Raptor(原作)  
      
    关键字     Web WAD CGI ISAPI 
      Web 应用的执行过程 
    -- 谈谈 WAD/CGI/ISAPI 的区别
     
        Borland 在 Delphi/C++ Builder 中提供了多种类型的 Web 应用开发,其中最常用的应该是用于调试的 Web App Debugger 应用(WAD应用)和在 Windows/IIS 平台下运行的 CGI/ISAPI 。虽然从理论上说,这几种类型的 Web 应用程序除了类型不同以外,应该没有什么太大的区别。即一般情况下,可以很容易改变其类型,如:假设有一个调试好的 WAD 应用,只要新建一个空的 ISAPI 应用,然后把 WAD 应用中的必要单元加进来编译一下即可生成一个同样功能的 ISAPI 应用。但不幸的是,事实并非如此,在本站发表《C++ Builder 6 BizSnap(2) -- 自定义数据传输》一文后不久,有几位朋友给我发来 Mail 说明他们在将文中的程序改成 ISAPI 后遇到一些问题,我才发现这几种类型的 Web 应用之间的一些必须关注的区别。
        那个问题出在数据库访问控件和 DataModule 上。在那个例子中,我是把数据访问控件放在 WebModule 中,这在 WAD 中是没什么问题的,但在 ISAPI 中却有问题,这与这两种类型的程序执行过程不同有关。另一个则是关于 DataModule 的,在 WAD 中增加一个 DataModule 来放数据访问控件是没什么问题的,但在 CGI 中却会出现程序不执行的情况(即出现下载文件的提示或出错),在 ISAPI 中则出现 AV(Access Violation) 错误。
        所以本文将从这几种类型的 Web 应用程序的执行过程分析来看看它们的区别。    先看看 WAD 的执行过程:    分析 WAD 类型的源程序得知:每个 WAD 应用都会用 TWebAppAutoObjectFactory 创建一个 Automation 对象,当 WAD 收到一个发给此 WAD 应用的 Web 请求时就会用 GetActiveObject 来调用一个运行中的实例,如果没有实例在运行就启动一个。一旦取得运行中的 WAD 应用实例就通过此 Automation 对象的接口把 Web 请求发过去,由此 Automation 对象调用 WebModule 来模拟真实的 Web 服务器。之后的执行是一般 Web 应用必要的过程。在 Automation 对象被释放时(如引用计数减为0时),同时释放 WebModule 等。即在整个 SOAP 请求期间,WebModule 都是可用的。    再来看看 CGI 应用:    CGI 是作为 Web 服务器外部的一个进程单独运行,它是一个标准的控制台程序,只是 Web 服务器把 Web 请求重定向到 CGI 程序的标准输入,而把 CGI 程序的标准输入重定向到 Web 响应。但是 Borland 在编译处理时可能有一些特别做法,即当程序中有 DataModule 时会把它编译为非 Web 应用,使这样的 CGI 程序在 IIS 中不能运行(即在浏览器中输入其 URL 时将出现下载对话框)。所以,必须在处理请求时动态创建 DataModule 才行。因为 CGI 是根据每个 Web 请求创建实例的,所以当请求响应返回, CGI 程序也就结束了,此时才释放 WebModule ,所以实际上在整个 SOAP 请求期间,WebModule 都是可用的,这一点跟 WAD 应用一样。    最后来看一下 ISAPI 应用:    实际上, ISAPI 应用是在第一个请求到达 Web 服务器时就被启动(此时创建 WebModule ),此操作在 ISAPI 的入口: DllEntryPoint 函数中实现。请求处理结束后, ISAPI 应用仍存在于内存中,包括 WebModule 也是。 Web 服务器为每个请求创建一个 Worker Thread 来处理,处理完成只是终止 Worker Thread 。即在处理请求时是在 Worker Thread 中,并不与 WebModule 在一起,特别是 IIS 可以用 dllhost.exe 来调用 ISAPI ,使它在独立的进程空间中运行(这种情况下不执行 DllEntryPoint),所以在处理请求时无法访问 WebModule 及同时创建的 DataModule (如果有的话),如果在处理请求时用到它们就将出现 AV 错误。所以在 ISAPI  中,不能使用全局的 DataModule ,只能动态创建。    解决 DataModule 的问题还有一个办法,那就是用 SOAP Server Data Module 来代替 DataModule 。为什么这样是可以的?因为 SoapDataModule 其实只是一个从 IAppServerSOAP 派生的接口,在每个请求处理时会自动创建相应的实例,可以省去手工动态创建 DataModule 的麻烦。但它也有一个问题,那就是在 WSDL 中多了很多不必要的接口: IAppServer/IAppServerSOAP 等,同时,如果在其中放了 DataSetProvider 的时候,会把不必要导出的表导出了。特别是用了 dbExpress 的情况,此时尽可能用 SQLClientDataSet 来代替 SQLDataSet + DataSetProvider + ClientDataSet 组合。[Mental Studio]猛禽 Aug.17-02 
     
     
      

  7.   


        再来看看 CGI 应用:    CGI 是作为 Web 服务器外部的一个进程单独运行,它是一个标准的控制台程序,只是 Web 服务器把 Web 请求重定向到 CGI 程序的标准输入,而把 CGI 程序的标准输入重定向到 Web 响应。但是 Borland 在编译处理时可能有一些特别做法,即当程序中有 DataModule 时会把它编译为非 Web 应用,使这样的 CGI 程序在 IIS 中不能运行(即在浏览器中输入其 URL 时将出现下载对话框)。所以,必须在处理请求时动态创建 DataModule 才行。因为 CGI 是根据每个 Web 请求创建实例的,所以当请求响应返回, CGI 程序也就结束了,此时才释放 WebModule ,所以实际上在整个 SOAP 请求期间,WebModule 都是可用的,这一点跟 WAD 应用一样。具体网址:
    http://www.csdn.net/develop/read_article.asp?id=14766
      

  8.   

    还有:     C++ Builder 6 BizSnap/SOAP/WebService(2) -- 通过 SOAP 传递自定义类型数据(改)    Raptor(原作)  
      
    关键字     BCB6 SOAP WebService 自定义类型 数据库 
      
        说明:本文经过一些改动,纠正了一些问题,因为原文无法修改,只好重发。
    不久前我收到几位朋友发来Mail说明他们在按照本文所述进行WebService应用开发时碰到的一个问题:在用ISAPI方式编写本文例子程序时发生AV错误。根据改进后的本例子程序修改了本文,请注意文中加粗部分内容。
    --2002-8-17     本文将做一个略复杂的例子,实现通过 SOAP 传递自定义的数据类型。本例子的功能是在服务端通过 ADO 的数据访问控件取得数据表内容,然后将其通过 SOAP 传递到客户端再显示。
        服务端: 
    1.New|WebServices|Soap Server Application ,如下图,与 Delphi 6 + Update 2 相比,除了左上角的图标以外,完全相同:  
    选 Web App Debugger executeable 类型, CoClass Name 为:wadSoapDemo2 ,如下图:  
    确定后将自动提示是否要新建一个接口,如下图,确定即可打开新建接口向导,如果要以后再增加接口,可以在 New|WebServices 中选择 SOAP Server Interface 同样可打开新建接口向导: 
    2.新建接口向导如下图,输入接口名:DataTable 即可生成一个 SOAP 服务端接口: 
    关于此向导的其它说明见《C++ Builder 6 BizSnap/SOAP/WebService(1) -- 一个 Hello world! 的例子》(以下简称《(1)》);
    3.(注意:原文的这部分有错,现在为修改后的)新建一个 DataModule ,放入四个数据库控件: ADOConnection1, ADODataSet1, DataSetProvider1, ClientDataSet1 ,其各属性设置如下表:ADOConnection1 ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=raptor\neutrino";
    LoginPrompt = false;  
    ADODataSet1 Connection = ADOConnection1;
    CommandText = "select FirstName, LastName from Employees";  
    DataSetProvider1 DataSet = ADODataSet1;  
    ClientDataSet1 ProviderName = DataSetProvider1;  完成后的 DataModule 如下图: 
    (关于这部分的补充说明):原用 dbExpress 在用于 ISAPI 时会出现“Unable load dbexpint.dll”的错误,所以改用 ADO 。另,因没有 ADOClientDataSet 控件,否则若是 BDE/dbExpress/IBExpress 则只需要两个控件即可。要把数据控件放在单独的 DataModule ,而不能放在 WebModule 中的原因见《Web 应用的执行过程 -- 谈谈 WAD/CGI/ISAPI 的区别》,本文例子仅供参考,建议在涉及数据库操作的应用中,最好用 SOAP Server Data Module (如《C++ Builder 6 BizSnap(3) -- DataSnap 数据库应用》)。
    4.SaveAll , Unit1 命名为: MainWM , Unit2 命名为 Demo2DM , Project1 命名为: Demo2 , DataTable 不改名; 
    5.在接口单元的头文件(DataTable.h)中增加一个自定义的类 -- TDataSetPack ,如下: class TDataSetPack : public TRemotable {
    private :
        int        FCount;
        AnsiString FXMLData;
    public :
        __fastcall TDataSetPack( TCustomClientDataSet * aClientDataSet )
            : TRemotable(),
            FCount( aClientDataSet->RecordCount ),
            FXMLData( aClientDataSet->XMLData )
        {
        }__published:
        __property int        Count   = { read = FCount   }; 
        __property AnsiString XMLData = { read = FXMLData };
    };自定义 SOAP 数据类型必须是从 TRemotable 类派生的,这一点与 Delphi 相同。其中 ClientDataSet 的 XMLData 属性是从 Delphi 6 开始新增的。其实 XMLData 中已经包含了记录数信息, Count 属性并不是必须的,这里为了演示自定义 SOAP 数据类型的使用,所以加入这个属性。注意:要在此头文件中加入:#include <DBClient.hpp>
    5.定义及实现 GetEmployeeTable 函数,其方法与《(1)》中相同,下面是在接口头文件(DataTable.h)和单元文件(DataTable.cpp)中的接口/类定义和我们加入的方法及其实现: //  DataTable.h
    __interface INTERFACE_UUID("{CF057C28-4130-4508-9F24-0BBD1C2CA5F0}") 
        IDataTable : public IInvokable
    {
    public:
        virtual TDataSetPack * GetEmployeeTable( void ) = 0;  //  新增方法
    };
    typedef DelphiInterface _di_IDataTable;//  DataTable.cpp
    class TDataTableImpl : public TInvokableClass, public IDataTable
    {
    public:
        TDataSetPack * GetEmployeeTable( void );  //  新增方法  /* IUnknown */
      HRESULT STDMETHODCALLTYPE QueryInterface(const GUID& IID, void **Obj)
                            { return GetInterface(IID, Obj) ? S_OK : E_NOINTERFACE; }
      ULONG STDMETHODCALLTYPE AddRef() { return TInterfacedObject::_AddRef();  }
      ULONG STDMETHODCALLTYPE Release(){ return TInterfacedObject::_Release(); }  /* Ensures that the class is not abstract */
      void checkValid() { delete new TDataTableImpl(); }
    };//  新增方法的实现:
    //  如果是 CGI/ISAPI 应用,则需要新建 DataModule1 ,相应修改见后面说明
    //  打开 ClientDataSet ,构造 TDataSetPack ,
    //  关闭 ClientDataSet 和数据库连接
    //  返回结果
    TDataSetPack * TDataTableImpl::GetEmployeeTable( void )
    {
    //  如果是 CGI/ISAPI 则要此句
    //    Application->CreateForm(__classid(TDataModule1), &DataModule1);
        DataModule1->ClientDataSet1->Open();
        TDataSetPack * p = new TDataSetPack( DataModule1->ClientDataSet1 );
        DataModule1->ClientDataSet1->Close();
        DataModule1->ADOConnection1->Close( );
        return p;
    }除了方法的实现部分以外,其它部分与《(1)》基本上一样。这个方法的实现功能,正如程序中的注释说明的那样,用于取得数据集并转换为我们定义的数据类型后返回。
    (关于这部分的补充说明):注意如果是 CGI/ISAPI 应用,其中的 DataModule1 是动态创建(原因如《Web 应用的执行过程 -- 谈谈 WAD/CGI/ISAPI 的区别》一文所述),所以相应的要把 Project|Source ( 即 Demo2CGI.cpp/Demo2ISAPI.cpp )中如下代码片段那样将自动创建语句去掉。       Application->CreateForm(__classid(TWebModule1), &WebModule1);
    //  如果是 CGI/ISAPI 应用则不要此句
    //         Application->CreateForm(__classid(TDataModule1), &DataModule1);
             Application->Run();6.注册接口及其实现类的部分也与《(1)》相同,就不再赘述了。 
    7.编译之即可产生: Demo2.exe ; 先运行一次 Demo2.exe ,完成注册的工作后启动 Web App Debugger 。打开浏览器, 输入 URL 为: http://localhost:1024/Demo2.wadSoapDemo2 即可看到一个标准的 SOAP 应用说明页面,点击进入相应链接即可看到相关的 WSDL ,在其中可以看到我们自定义的数据类型说明,如下面的 WSDL 片断所示:   <types>
        <xs:schema targetNamespace="urn:DataTable" xmlns="urn:DataTable">
          <xs:complexType name="TDataSetPack">
            <xs:sequence>
              <xs:element name="Count" type="xs:int"/>
              <xs:element name="XMLData" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:schema>
      </types>    客户端程序: 
    1.New|Application 新建一个一般 VCL 应用程序; 
    2.SaveAll , Unit1 命名为 ClnMain , Project1 命名为 Client ; 
    3.New|Web Services|Web Services Importer :
    在下图中的URL中输入: http://localhost:1024/Demo2.wadSoapDemo2/wsdl/IDataTable,  
    如果上面用浏览器可以看到正确的 XML 文档的话,选择“Next”后将产生导入的结果,如下图: 
    其中有我们在服务端定义的数据类型 TDataSetPack 、接口 IDataTable 及其方法 GetEmployeeTable ,选择完成即可生成接口单元; 
    4.SaveAll, IDataTable 单元不改名保存,再在 ClnMain 中 #include IDataTable.h ; 
    5.在 Form 上放上一个 ClientDataSet, DataSource, DBGrid, Button, Label 等几个控件,其各属性设置如下表:ClientDataSet1 全部默认 
    DataSource1 DataSet = ClientDataSet1;  
    DBGrid1 DataSource = DataSource1;  
    Button1 Caption = "Fetch data";  
    Label1 Caption = "Count:0";  完成后的 Form 如下图: 
    6.双击 Button1 输入下面的程序: void __fastcall TForm2::Button1Click(TObject *Sender)
    {
        TDataSetPack * p = GetIDataTable()->GetEmployeeTable();    Label1->Caption = AnsiString( "Count:" ) + IntToStr( p->Count );    
        ClientDataSet1->XMLData = p->XMLData;
    }7.编译运行,按 Button1 , DBGrid1 中将显示服务端返回的数据集内容, Label1 中将显示记录数,如下图(说明,此图仍为原来用 InterBase 时的数据);  
        这只是一个简单的数据库访问的例子,只能从服务端取回数据集, C++ Builder 6 中已经将 MIDAS/DataSnap 和 SOAP/WebService 结合,可以通过 SOAP/WebService 实现非常强大的数据库操作能力,这将在以后的文章中介绍。 [Mental Studio]猛禽 Apr.30-02