第一次翻译文档,如有问题敬请原谅并指教!
_ 英文原文 _
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#。
在一个已存在的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()>