猛禽--C++ Builder 6 BizSnap/SOAP/WebService(2)
来源:互联网 发布:淘宝购物车满了图片 编辑:程序博客网 时间:2024/05/01 00:25
C++ Builder 6 BizSnap/SOAP/WebService(2)
本文将做一个略复杂的例子,实现通过 SOAP 传递自定义的数据类型。本例子的功能是在服务端通过 dbExpress 的数据访问控件取得数据表内容,然后将其通过 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.在生成后的 WebModule 单元中放入四个数据库控件: SQLConnection1, SQLDataSet1, DataSetProvider1, ClientDataSet1 ,其各属性设置如下表:
LoginPrompt = false;
Params->Values["Database"] = "[...]//Examples//Database//Employee.gdb";
// 上面的 [...] 为你的 InterBase 安装路径 SQLDataSet1 SQLConnection = SQLConnection1;
CommandText = "select FULL_NAME, PHONE_EXT"; DataSetProvider1 DataSet = SQLDataSet1; ClientDataSet1 ProviderName = DataSetProvider1;
完成后的 WebModule 如下图:
《!--图丟了--》4.SaveAll , Unit1 命名为: MainWM , Project1 命名为: Demo2 , DataTable 不改名;
5.在接口单元的头文件(DataTable.h)中增加一个自定义的类 -- TDataSetPack ,如下:
class TDataSetPack : public TRemotable {private : int FCount; AnsiString FXMLData;public : __fastcall TDataSetPack( TClientDataSet * 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.cppclass 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(); }};// 新增方法的实现:// 打开 ClientDataSet ,构造 TDataSetPack ,// 关闭 ClientDataSet 和数据库连接// 返回结果TDataSetPack * TDataTableImpl::GetEmployeeTable( void ){ WebModule2->ClientDataSet1->Open(); TDataSetPack * p = new TDataSetPack( WebModule2->ClientDataSet1 ); WebModule2->ClientDataSet1->Close(); WebModule2->SQLConnection1->Close(); return p;}
除了方法的实现部分以外,其它部分与《(1)》基本上一样。这个方法的实现功能,正如程序中的注释说明的那样,用于取得数据集并转换为我们定义的数据类型后返回。
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 等几个控件,其各属性设置如下表:
完成后的 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 中将显示记录数,如下图;
《!--图丟了--》这只是一个简单的数据库访问的例子,只能从服务端取回数据集, C++ Builder 6 中已经将 MIDAS/DataSnap 和 SOAP/WebService 结合,可以通过 SOAP/WebService 实现非常强大的数据库操作能力,这将在以后的文章中介绍。
- 猛禽--C++ Builder 6 BizSnap/SOAP/WebService(2)
- 猛禽--C++ Builder 6 进行 SOAP 开发(1) -- 一个 Hello world! 的例子
- c++builder 2006 SOAP/WebService 第一个hello word!
- c++builder 2006 SOAP/WebService 第一个hello word!服务端
- 使用AXIS进行webservice开发-添加SOAP Header
- SOAP,WebService
- WebService,SOAP
- webservice soap
- webservice soap
- WebService SOAP
- WebService,SOAP
- webservice soap
- webservice--SOAP
- c++builder 中调用WebService的例子
- 关键字:c++builder(BCB) C# WebService EAccessViolation
- 【soap】利用soap实现webservice
- c++ builder 和 vc调用c#.net webservice的不同
- 浅谈restful webservice SOAP webservice
- 2006年毕业生薪资大起底
- 利用ImageButton按钮实现展开和收缩DataGrid的嵌套关系表
- 【原创】Apache在linux AS3上使用会造成CPU使用率达到100%问题一例
- 运用类反射机制简化Struts应用程序的开发
- 猛禽--C++ Builder 6 进行 SOAP 开发(1) -- 一个 Hello world! 的例子
- 猛禽--C++ Builder 6 BizSnap/SOAP/WebService(2)
- ASP.NET 2.0中的数据库链接字符串的使用方法
- CEGUI学习(1)-基本绘制
- 西行漫记(14):慌神了
- 在ASP.NET中实现AJAX
- SQL SERVER2000中取得列数的存储过程
- 性能测试与分析中密集型的概念
- 明明白白——DLL?
- [原创] 在 blog 中输入复杂的数学公式的方法