C++ Builder 6 BizSnap/SOAP/WebService(3) - -- 用 SOAP 实现三层数据库应用

本文将使用 SOAP 和 DataSnap 做一个基于 WebService 的多层应用的例子,实现通过 SOAP 实现三层数据访问。本例子的功能是在服务端通过 dbExpress 的数据访问控件取得数据表内容,然后将其通过 SOAP 传递到客户端再显示,客户端也可以修改数据并更新到服务端。

服务端:
1.New|WebServices|Soap Server Application ,如下图:

选 Web App Debugger executeable 类型, CoClass Name 为:wadSoapDemo3 ,如下图:

        <img width="317" height="254" alt="" src="/images/illustrations/bcb6_soap3ide1.jpg"/>
        <p>确定后将自动提示是否要新建一个接口,如下图,因为本例子不需要自定义接口,所以选择取消:</p>
        <img width="252" height="122" alt="" src="/images/illustrations/bcb6_soap1ide3.jpg"/>
        <p>2.新建 SOAP Server Data Module ,其向导如下图,输入模块名:SDMDemo3 即可生成一个 SOAP
          数据模块,提供了一个名为 IAppServerSOAP 的 WebService 接口:</p>
        <img width="377" height="146" alt="" src="/images/illustrations/bcb6_soap3ide2.jpg"/>
        <p> 3.在生成后的 SoapDataModule 中放入四个数据库控件: SQLConnection1, SQLDataSet1,
          DataSetProvider1 ,其各属性设置如下表:</p>
        <table width="94%" border="1">
          <tbody><tr>
            <td width="12%" height="28">SQLConnection1</td>
            <td width="88%" height="28">ConnectionName = IBLocal;<br/>
              LoginPrompt = false;<br/>
              Params-&gt;Values[&quot;Database&quot;] = &quot;[...]\\Examples\\Database\\Employee.gdb&quot;;
              <br/>
              // 上面的 [...] 为你的 InterBase 安装路径</td>
          </tr>
          <tr>
            <td width="12%" height="25">SQLDataSet1</td>
            <td width="88%" height="25">SQLConnection = SQLConnection1;<br/>
              CommandText = &quot;select FULL_NAME, PHONE_EXT from EMPLOYEE&quot;;
            </td>
          </tr>
          <tr>
            <td width="12%" height="14">DataSetProvider1</td>
            <td width="88%" height="14">DataSet = SQLDataSet1; </td>
          </tr>
        </tbody></table>
        <p>完成后的 WebModule 如下图:</p>
        <img width="428" height="256" alt="" src="/images/illustrations/bcb6_soap3ide3.jpg"/>
        <p> 4.SaveAll , Unit3 命名为: Demo3SDM, Unit2 命名为: MainWM , Unit1 不改名,
          Project1 命名为: Demo3 ; <br/>
          5.编译之即可产生: Demo3.exe ,至此,不用写一行代码即完成服务端的编写;<br/>
        </p>
        <p>先运行一次 Demo3.exe ,完成注册的工作后启动 Web App Debugger 。打开浏览器, 输入 URL 为:
          http://localhost:1024/Demo3.wadSoapDemo3 即可看到一个标准的 SOAP 应用说明页面,在其中可以看到导出了三个与
          DataSnap 有关的接口:<br/>
          1、IAppServer : DataSnap 的基本接口,在 SOAP 应用中并没有使用,估计是为与 Delphi 6 未打
          Patch 2# 开发的程序兼容而保留的;<br/>
          2、IAppServerSOAP : SOAP 多层应用的基本接口,是 MIDAS 中的 IAppServer 的 SOAP 版;<br/>
          3、ISDMDemo3 : SOAP Server Data Module 的接口。</p>
        <p>客户端程序: <br/>
          1.New|Application 新建一个一般 VCL 应用程序; <br/>
          2.SaveAll , Unit1 命名为 Main , Project1 命名为 Client ; <br/>
          3.在 Form 上放上一个 SoapConnection, ClientDataSet, DataSource, DBGrid,
          DBNavigator, Button 等几个控件,其各属性设置如下表:</p>
        <table width="94%" border="1">
          <tbody><tr>
            <td width="12%" height="9">SoapConnection1</td>
            <td width="88%" height="9">URL = &quot;http://localhost:1024/Demo3.wadSoapDemo3/soap&quot;;</td>
          </tr>
          <tr>
            <td width="12%" height="13">ClientDataSet1</td>
            <td width="88%" height="13">
              <p>RemoteServer = SoapConnection1;<br/>
                Provider = &quot;DataSetProvider1&quot;;<br/>
                Active = true;</p>
              </td>
          </tr>
          <tr>
            <td width="12%" height="13">DataSource1</td>
            <td width="88%" height="13">DataSet = ClientDataSet1; </td>
          </tr>
          <tr>
            <td width="12%" height="14">DBGrid1</td>
            <td width="88%" height="14">DataSource = DataSource1; </td>
          </tr>
          <tr>
            <td width="12%" height="2">DBNavigator</td>
            <td width="88%" height="2">DataSource = DataSource1; </td>
          </tr>
          <tr>
            <td width="12%" height="2">Button1</td>
            <td width="88%" height="2">Caption = &quot;Apply&quot;; </td>
          </tr>
        </tbody></table>
        <p>正常情况下,设置 ClientDataSet 的 Provider 属性时,点击下拉按钮将使用服务端运行,并列出所有 Provider
          (本例只有一个)。设置好 ClientDataSet 的 Active 属性后将显示数据如下图:</p>
        <img width="457" height="362" alt="" src="/images/illustrations/bcb6_soap3ide4.jpg"/>
        <p>4.双击 Button1 输入下面的程序: </p>
        <pre>void __fastcall TForm2::Button1Click(TObject *Sender)<br/>{<br/>    ClientDataSet1-&gt;ApplyUpdates( 0 );<br/>}<br/></pre>
        <p>5.至此,客户端程序也完成了,编译并运行(确定 Web App Debugger 已运行),可以看到服务端运行一会儿, 它的窗体闪现几秒钟后客户端程序即可取得数据并显示出来。现在可以通过
          DBNavigate/DBGrid 对数据进行操作, 操作完成后按 Apply 按钮即可将数据修改提交到服务端,此操作会运行服务端程序。
        </p>
        <p>就这样,我们只写了一行程序就完成了一个基于 SOAP 的多层数据库应用。<br/></p></div><p align="right">猛禽 Aug.17-02</p>