posts - 46, comments - 76, trackbacks - 5, articles - 1
在微软中国找到了一个官方的说法------不建议将DataSet直接作为返回值传送,因为里面含有大量复杂的schema以及更改等信息,大部分非.NET语言在解析上有困难。建议使用DataSet.WriteXML方法将简化后的XML版本作为一个WideString回传。经过试验,已经在Delphi下轻松通过,Delphi中还需要使用XML 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.

---------------------------------------------------------------------------------------
.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();
  }
 }
}

Feedback

#1楼    回复  引用    

2006-01-06 22:36 by FreshMan [未注册用户]
大侠:能否麻烦把Delphi的源码(包括界面控件属性设置)发送一份至我的邮箱,认真学习学习。
biehy@163.com
非常感谢!

#2楼    回复  引用    

2006-01-21 15:03 by 虚宇 [未注册用户]
大侠:
是否也可以发一份给我?
我在做的过程中出现不能将数据显示在DBGrid表格里面。
OICQ:7935234
MSN: aswordjj@hotmail.com
Email:asword.jj@163.com

#3楼 [楼主]   回复  引用  查看    

2006-01-21 23:37 by xujh      
我不明白还要什么代码?我的代码不是已经写在Blog里了吗?

#4楼    回复  引用    

2006-02-22 22:11 by wxk [未注册用户]
传入字符串参数时参数时入WEB SERVICE 后会变为乱码?

#5楼    回复  引用    

2008-04-09 00:12 by kittow [未注册用户]
我按照楼主的代码,无论如何都得不到数据,DBGrid只有空的表头

#6楼    回复  引用    

2008-06-24 09:40 by kongqingcho [未注册用户]
为什么我测试你上面代码的时候会出现“TransformationFile must be specified”

#7楼    回复  引用    

2008-09-26 18:58 by peng4463 [未注册用户]
为什么我测试你上面代码的时候会出现“TransformationFile must be specified”

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-03-16 18:11 编辑过


相关链接: