使用XML Web Service返回DataTable对象的问题

第一次翻译文档,如有问题敬请原谅并指教!

_ 英文原文 _

This article was previously published under Q306134

问题

在Visual Studio .Net集成开发环境中试图添加到这个XML Web Service的引用时,也会看到下面类似的错误信息:

System.Data.DataRelation cannot be serialized because it does not have a default public constructor.

在Visual Studio .Net集成开发环境中试图添加到这个XML Web Service的引用时,也会看到下面类似的错误信息:

Internal Server Error. Unable to request "http://localhost/Webservice1/Service1.asmx?WSDL". The server responded with error code "ProtocolError".

原因

DataTable、 DataRow、 DataView以及 DataViewManager 等对象不能被序列化也不能被从一个XML XML Web service返回。要返回,至少必须是一个完整的 DataSet ,因此必须把要返回的数据复制到一个 DataSet 中。

解决

解决这个问题的方法是:返回一个 DataSet 以替代 DataTable 。一个 DataSet 对象中可以包含一个或多个 DataTable 对象。

状态

本行为正在设计中。

更多信息

操作步骤

说明: 以下示例包含VB.NET、C#和J#。

  1. 在一个已存在的XML Web Service中添加一个返回DataTable对象的Web Service方法。以下代码创建一个连接到Microsoft SQL Server数据库和Authors表。如果你想使用本代码,请修改并连接到你的安装有SQL Server的计算机上。

    'Visual Basic

 1<webmethod()> Function GiveMeADataTable() As System.Data.DataTable
 2            Dim conn As New System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;")
 3            Dim ds As New System.Data.DataSet()
 4            Dim adapter As New System.Data.SqlClient.SqlDataAdapter()
 5            adapter.SelectCommand = New System.Data.SqlClient.SqlCommand("Select * From Authors", conn)
 6            adapter.Fill(ds, "Authors")
 7            Return ds.Tables("Authors")
 8        End Function
 9    					
10    
11        //Visual C#
12       [WebMethod]
13       public System.Data.DataTable GiveMeADataTable()
14       {
15            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
16          System.Data.DataSet ds = new System.Data.DataSet();
17            System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
18            adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("Select * From Authors", conn);
19            adapter.Fill(ds, "Authors");
20          return ds.Tables["Authors"];
21       }    
22    
23    					
24    
25        /**Visual J# */ 
26    	/** @attribute WebMethod() */ 
27    	public System.Data.DataTable GiveMeADataTable()
28    	{
29    		System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
30    		System.Data.DataSet ds = new System.Data.DataSet();
31    		System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
32    		adapter.set_SelectCommand(new System.Data.SqlClient.SqlCommand("Select * From Authors", conn));
33    		adapter.Fill(ds, "Authors");
34    		System.Data.DataTableCollection dtc = ds.get_Tables();
35    		return dtc.get_Item("Authors");
36    	} 
37    					
38
39  2. 编译这个XML Web service.。 
40  3. 浏览你添加了上面的方法的XML Web Service的URL,你将收到错误信息。 
41  4. 修改为如下的代码,使用 **DataSet** 对象替换 **DataTable** 对象: 
42    
43        'Visual Basic
44        <webmethod()> Function GiveMeADataSet() As System.Data.DataSet
45            Dim conn As New System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;")
46            Dim ds As New System.Data.DataSet()
47            Dim adapter As New System.Data.SqlClient.SqlDataAdapter()
48            adapter.SelectCommand = New System.Data.SqlClient.SqlCommand("Select * From Authors", conn)
49            adapter.Fill(ds, "Authors")
50            Return ds
51        End Function
52    					
53    
54        //Visual C#
55       [WebMethod]
56       public System.Data.DataSet GiveMeADataSet()
57       {
58            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
59          System.Data.DataSet ds = new System.Data.DataSet();
60            System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
61            adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("Select * From Authors", conn);
62            adapter.Fill(ds, "Authors");
63          return ds;
64       }
65    
66    					
67    
68        /**Visual J# */ 
69    /** @attribute WebMethod() */ 
70    	public System.Data.DataSet GiveMeADataSet()
71    	{
72    		System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
73    		System.Data.DataSet ds = new System.Data.DataSet();
74    		System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
75    		adapter.set_SelectCommand(new System.Data.SqlClient.SqlCommand("Select * From Authors", conn));
76    		adapter.Fill(ds, "Authors");
77    		return ds;
78    	}
79    					
80
81  5. 编译这个XML Web Service。 
82  6. 再浏览这个XML Web Service方法的URL连接,将不会看到上面的错误提示。 
83
84
85
86###  本文档信息应用于: 
87
88  * Microsoft Web Services (包括.NET Framework) 1.0 
89  * Microsoft Web Services (包括.NET Framework 1.1) 
90  * Microsoft Visual Basic .NET (2002) 
91  * Microsoft Visual C# .NET (2002) 
92  * Microsoft ASP.NET (包括.NET Framework) 1.0 
93  * Microsoft Visual J# .NET (2002) 
94  * Microsoft Visual J# .NET (2003) 
95  * Microsoft Visual C# .NET (2003) 
96  * Microsoft Visual Basic .NET (2003) 
97  * Microsoft ASP.NET (包括.NET Framework 1.1)</webmethod()></webmethod()>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus