使用返回 DataTable 的 XML Web 服务时出现问题

使用返回 DataTable 的 XML Web 服务时出现问题适用于
本文的发布号曾为 CHS306134

症状

在 XML Web 服务从它的一个 Web 方法返回 DataTable 的情况下,如果您浏览到该 XML Web 服务的 URL,可能会出现下面的错误消息:
System.Data.DataRelation 无法序列化,因为它不具有默认的公共构造函数。
当您尝试在 Visual Studio .NET 集成开发环境 (IDE) 中设置对该 XML Web 服务的 Web 引用时,也可能看到类似下文的错误消息:
内部服务器错误。 无法请求“http://localhost/Webservice1/Service1.asmx?WSDL”。 服务器响应了错误代码“ProtocolError”。

原因

DataTableDataRowDataView DataViewManager 对象无法序列化并且无法从 XML Web 服务返回。 若要使返回结果比完整的 DataSet 少,必须将要返回的数据复制到一个新 DataSet 中。

解决方案

若要解决此问题,应返回 DataSet 而不应返回 DataTableDataSet 对象可以包含一个或多个 DataTable 对象。

状态

这种现象是设计使然。

更多信息

重现问题的步骤

备注 : 我们为 Visual Basic .Net 和 Visual C# .Net 提供了代码示例。
  1. 将返回 DataTable 的 Web 方法添加到现有的 XML Web 服务。 下面的代码创建与 Microsoft SQL Server 数据库的连接并检索 Authors 表。 如果您要使用该代码,请对它进行修改以连接到您的 SQL Server 计算机。
    'Visual Basic
        
                
                
                 
                  Function GiveMeADataTable() As System.Data.DataTable
            Dim conn As New System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;")
            Dim ds As New System.Data.DataSet()
            Dim adapter As New System.Data.SqlClient.SqlDataAdapter()
            adapter.SelectCommand = New System.Data.SqlClient.SqlCommand("Select * From Authors", conn)
            adapter.Fill(ds, "Authors")
            Return ds.Tables("Authors")
    End Function
                
                
    //Visual C#
       [WebMethod]
       public System.Data.DataTable GiveMeADataTable()
       {
            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
          System.Data.DataSet ds = new System.Data.DataSet();
            System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
            adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("Select * From Authors", conn);
            adapter.Fill(ds, "Authors");
          return ds.Tables["Authors"];
       }    
    
  2. 下面的代码创建与 Microsoft SQL Server 数据库的连接并检索 Authors 表。 如果您要使用该代码,请对它进行修改以连接到您的 SQL Server 计算机。编译 XML Web 服务。
  3. 下面的代码创建与 Microsoft SQL Server 数据库的连接并检索 Authors 表。 如果您要使用该代码,请对它进行修改以连接到您的 SQL Server 计算机。浏览到刚才添加了代码的 XML Web 服务的 URL。 注意,将会出现错误消息。
  4. 下面的代码创建与 Microsoft SQL Server 数据库的连接并检索 Authors 表。 如果您要使用该代码,请对它进行修改以连接到您的 SQL Server 计算机。如下所示修改代码以返回 DataSet 而不返回 DataTable
    'Visual Basic
        
                
                
                 
                  Function GiveMeADataSet() As System.Data.DataSet
            Dim conn As New System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;")
            Dim ds As New System.Data.DataSet()
            Dim adapter As New System.Data.SqlClient.SqlDataAdapter()
            adapter.SelectCommand = New System.Data.SqlClient.SqlCommand("Select * From Authors", conn)
            adapter.Fill(ds, "Authors")
            Return ds
    End Function
                
                
    //Visual C#
       [WebMethod]
       public System.Data.DataSet GiveMeADataSet()
       {
            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
          System.Data.DataSet ds = new System.Data.DataSet();
            System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
            adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("Select * From Authors", conn);
            adapter.Fill(ds, "Authors");
          return ds;
       }
    
  5. 下面的代码创建与 Microsoft SQL Server 数据库的连接并检索 Authors 表。 如果您要使用该代码,请对它进行修改以连接到您的 SQL Server 计算机。编译 XML Web 服务。
  6. 下面的代码创建与 Microsoft SQL Server 数据库的连接并检索 Authors 表。 如果您要使用该代码,请对它进行修改以连接到您的 SQL Server 计算机。浏览到刚才添加了上述代码的 XML Web 服务的 URL。 注意,此次不会出现错误消息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值