2009-02-18 34 views

回答

1

您可以通过Web服务传输DataTable。所以这可能是你最好的选择,因为这是客户要求的。

5

当然。 DataTable和DataSet都是可序列化的,并且它们也具有可以使用的ReadXml()和WriteXml()函数。

7

如果您将其公开为DataSet/DataTable,它仍然会自行进行序列化(通过IXmlSerializable,IIRC)。请注意,如果您希望服务可以移植到其他模式(即Java客户端等),则DataSet/DataTable不会为Web服务上的良好数据类型创建数据类型。但你可以简单地暴露它如此,如果你想......; .NET将处理翻译。

+5

确保设置了TableName,否则在序列化时会出错。 – tsilb 2012-10-05 23:16:52

7

请参阅this post理查德Blewett为什么你可能不想这样做的原因。

编辑: 以上概括为:

  • 使用DataSet是不能互通的。它使用仅在链接的每一端使用Microsoft堆栈时才有意义的注释。
  • DataSet是通过网络发送数据的相当低效的类 - 它还包含更改跟踪数据和元数据。
  • 它引入了紧密的耦合 - 在服务端进行的更改可能甚至不需要客户端也必须反映在客户端。
+1

链接不再工作 – betitall 2013-07-18 22:46:19

9

您可以通过DataSet.GetXml()

发送数据从一个数据集的XML字符串,比用户可以用DataSet.ReadXml()

反序列化并通过DataSet.Tables

得到数据集中的数据表祝你好运

1

最简单,最可互操作的方式是使用GetXml()方法将数据集序列化为XML,然后通过作为来自Web服务的字符串。客户端可以使用ReadXml()方法将其反序列化。

我们已经消耗了这样做的服务,它运行得非常好。

另一种方法是公开服务中的DataSet类,并返回数据集对象。但是这会使事情变得复杂,特别是如果任何客户端应该是非.NET的。

2

DataTable是可序列化的,但存在一些技巧来通过WebService返回一个无类型的DataTable。

在Web服务方法返回填充的DataTable(在服务端)之前,它必须具有分配的属性TableName。如果在OperationContract DataTable内部接收到类型化DataTable的引用,那么序列化将失败,并显示messaga,如“”服务器没有提供有意义的回复。这可能是由于合同不匹配,过早会话关闭或内部服务器错误引起的“

这意味着您应该填充创建的DataTable,例如使用方法合并(或手动)。这里是DataContract实现示例;

DataTable IHorizonCLService.RetrieveChangeLog(int iId) 
{ 
    DataTable dt = new DataTable(); //create new DataTable to be returned by this web method 
    dt.Merge(HorMan.RetrieveChangeLog(iId)); //get typed DataTable and fills the DataTable 
    dt.TableName = "SurChangeLogHor"; //assigns name 
    return dt; 
} 
1

here

而且,从来都只是一个有趣的话,永远,永远发System.Data.DataSet中的实例,通过线路从未有过,是不是现在,和。永远不会有任何理由发送任何实例此类型在任何地方它超越了大规模,使得10,000个属性数据传输对象看起来很轻。事物是可序列化的并不意味着它应该是。

相关问题