找回密码
 立即注册
搜索
查看: 382|回复: 3

[急]如何在Delphi中使用由.NET开发的Web Service返回的DataSet类型

[复制链接]

403

主题

3329

回帖

5022

积分

网站编辑

积分
5022
发表于 2004-6-29 15:15:58 | 显示全部楼层 |阅读模式
用.NET开发的Web Service很容易就返回了一个.NET自己的DataSet类型,内容上也是XML格式,但在Delphi中如何使用它呢?尝试着用ClientDataSet.XMLData来解析它,但失败!反之,用.NET如何使用Delphi编制的WebService返回的多笔记录呢?目前可以打开返回的XML文本,但在ASP.NET中如何解析还没有试验成功。

403

主题

3329

回帖

5022

积分

网站编辑

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

使用道具 举报

403

主题

3329

回帖

5022

积分

网站编辑

积分
5022
 楼主| 发表于 2004-7-4 15:05:41 | 显示全部楼层
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.
回复

使用道具 举报

403

主题

3329

回帖

5022

积分

网站编辑

积分
5022
 楼主| 发表于 2004-7-4 15:09:33 | 显示全部楼层
.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();
  }


}
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|海浩社区

GMT+8, 2025-9-21 18:38 , Processed in 0.078422 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表