Ado.net DataSet 与delphi的一些技巧(web service)

在微软中国找到了一个官方的说法------不建议将DataSet直接作为返回值传送,因为里面含有大量复杂的schema以及更改等信息,大部分非.NET语言在解析上有困难。建议使用DataSet.WriteXML方法将简化后的XML版本作为一个WideString回传。经过试验,已经在Delphi下轻松通过,Delphi中还需要使用XML Mapper工具事先生成Transfomation(XTR)文件。

来自: xujh, 时间: 2004-07-04 11:30:02, ID: 2694891

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.

-----------------------------------------------------------------

来自: xujh, 时间: 2004-07-04 11:30:28, ID: 2694892

.NET WebService代码
---------------------------------------------------------------------------------------
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();
 }


}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值