Delphi 操作webservice返回值为dataset的处理办法
2011-07-22 11:22
295 查看
在微软中国找到了一个官方的说法------不建议将DataSet直接作为返回值传送,因为里面含有大量复杂的schema以及更改等信息,大部分非.NET语言在解析上有困难。建议使用DataSet.WriteXML方法将简化后的XML版本作为一个WideString回传。经过试验,已经在Delphi下轻松通过,Delphi中还需要使用XML
Mapper工具事先生成Transfomation(XTR)文件。
Delphi7客户端代码
----------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
[b].NET WebService代码
---------------------------------------------------------------------------------------
[/b]
Mapper工具事先生成Transfomation(XTR)文件。
Delphi7客户端代码
----------------------------------------------------------------------------------------------------------------------------
unit WSTestMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, InvokeRegistry, StdCtrls, Rio, SOAPHTTPClient, Grids, DBGrids, DB, DBClient, DBTables, Provider, xmldom, Xmlxform,XMLIntf,XMLDoc,SOAPConst; type TForm1 = class(TForm) HTTPRIO1: THTTPRIO; Button1: TButton; Memo1: TMemo; XMLTransformProvider1: TXMLTransformProvider; ClientDataSet1: TClientDataSet; DataSource1: TDataSource; DBGrid1: TDBGrid; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses WSTestDefine; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var A:Service1Soap; B:WideString; XMLDoc: IXMLDocument; begin A := HTTPRIO1 as Service1Soap; B := A.GetPersonTable; Memo1.Lines.Add( B ); ClientDataset1.Active := FALSE; XMLDoc := NewXMLDocument; XMLDoc.Encoding := SUTF8; XMLDoc.LoadFromXML(B); XMLTransformProvider1.TransformRead.SourceXmlDocument := XMLDoc.GetDOMDocument; ClientDataset1.Active := TRUE; end; end.
---------------------------------------------------------------------------------------
[b].NET WebService代码
---------------------------------------------------------------------------------------
[/b]
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; using System.Data.OracleClient; using System.IO; namespace WS0622 { /// <summary> /// Service1 的摘要说明。 /// </summary> public class Service1 : System.Web.Services.WebService { public Service1() { //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的 InitializeComponent(); } #region 组件设计器生成的代码 //Web 服务设计器所必需的 private IContainer components = null; /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { } /// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose( bool disposing ) { if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing); } #endregion // WEB 服务示例 // HelloWorld() 示例服务返回字符串 Hello World // 若要生成,请取消注释下列行,然后保存并生成项目 // 若要测试此 Web 服务,请按 F5 键 [Serializable] public class Person { public Person() { } public Person(string name,string gender) { this.Name=name; this.Gender=gender; } public string Name=""; public string Gender=""; } [WebMethod(CacheDuration=60)] public Person[] GetPersons() { Person Alice=new Person("Alice","Female"); Person Bob=new Person("Bob","Male"); Person Chris=new Person("Chris","Female"); Person Dennis=new Person("Dennis","Male"); return new Person[]{Alice,Bob,Chris,Dennis}; } [WebMethod] public string GetPersonTable() { DataTable table=new DataTable("Person"); table.Columns.Add("Name"); table.Columns.Add("Gender"); table.Rows.Add(new string[2]{"Alice","Female"}); table.Rows.Add(new string[2]{"Bob","Male"}); table.Rows.Add(new string[2]{"Chris","Female"}); table.Rows.Add(new string[2]{"Dennis","Male"}); table.Rows.Add(new string[2]{"Eric","Male"}); DataSet dataset=new DataSet("PersonTable"); dataset.Tables.Add(table); System.Text.StringBuilder strbuilder=new System.Text.StringBuilder(); StringWriter writer=new StringWriter(strbuilder); dataset.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema); return strbuilder.ToString(); } } }
相关文章推荐
- WebService处理.net中Dataset问题解决办法
- webservice不能序列化接口问题,返回值为IList或者参数为接口的解决办法。
- webservice如何处理返回值是list集合
- C#写的webservice返回值为xmlDocument或者xmlDataDocument,客户端调用如何进行处理
- linq to entity 分页方法不支持LastOrDefault等操作的处理办法
- C# 使用DataSet+dataAdapter操作后台数据库之事务处理方法1,欢迎拍砖
- DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
- MFC 处理耗时操作的一种办法
- DELPHI操作ACCESS数据库(两种方式噢)dataset与table
- 20101109 学习记录: C#.net访问web URL并处理返回值 && 不加web引用调用webservice
- windows phone 7 调用webService,返回DataSet的处理
- 金蝶K3系统个别用户操作卡顿的处理办法
- win10下使用nltk的brown的词性tag包报错以及处理方法安装nltk相应包的操作办法
- java axis 1.4访问c# webservice,并获取返回值为dataset
- java处理.net webService传回的DataSet对象
- 在ASP.NETAtlas中调用WebService—处理错误,超时以及响应用户的取消操作
- WebService 操作超时的问题及其解决办法
- webdriver 操作 Firefox 在关闭浏览器时弹出 “Plugin Container for Firefox已停止工作” 处理办法。
- C#.net访问web URL并处理返回值 && 不加web引用调用webservice
- 用户频繁操作耗时开关的处理办法