Problemas ao usar um XML Web service que retorna uma DataTable

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 306134
Sintomas
Quando você navega para a URL de um XML Web service que retorna uma DataTable de um dos seus métodos de Web, você receberá a seguinte mensagem de erro:
System.Data.DataRelation não pode ser serializado porque não tem um construtor público padrão.
Você também poderá ver uma mensagem de erro semelhante à seguinte quando você tenta definir uma Web referência a este XML Web Services no ambiente de desenvolvimento integrado Visual Studio.NET (IDE):
Erro interno do servidor. Não é possível solicitar "http://localhost/Webservice1/Service1.asmx?WSDL". O servidor respondeu com código de erro "ProtocolError".
Com o .NET Framework 1.1 Service Pack 1 (SP1), poderá receber a seguinte mensagem de erro:
System.NotSupportedException: Não é possível serializar o membro System.ComponentModel.MarshalByValueComponent.Site do tipo System.ComponentModel.ISite porque é uma interface.
Você também pode receber uma página em branco em vez de qualquer uma das seguintes mensagens de erro se Mostrar mensagens de erro HTTP amigáveis estiver ativada no Microsoft Internet Explorer. Por padrão, a opção Mostrar mensagens de erro HTTP amigáveis está ativada.

Se você tentar adicionar uma referência da Web para um XML Web service que retorna um DataTable, você receberá a seguinte mensagem de erro:
O documento no http://<server>/vdir/service1.asmx url não foi reconhecido como um tipo de documento conhecidos.
Causa
Os objetos DataTable , DataRow , DataView e DataViewManager não pode ser serializados e não pode ser retornados de um XML Web service. Para retornar menos de um DataSet completa, você deve copiar os dados que você deseja retornar a um novo DataSet .
Resolução
Para resolver esse problema, retorne um DataSet em vez de uma DataTable . objetos DataSet podem conter um ou mais objetos DataTable .
Situação
Esse comportamento é por design.
Mais Informações

Passos para reproduzir o problema

Observação : código de exemplo é fornecido para Visual Basic. NET, Visual translation from VPE for Csharp .NET e Visual J# .NET.
  1. Adicione um método Web que retorna uma DataTable para um XML Web Services existente. O código a seguir cria uma conexão com um banco de dados do Microsoft SQL Server e recupera a tabela autores. Se você desejar usar o código, modifique-o para se conectar a um do SQL Server computadores.
    'Visual Basic    <WebMethod()> 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"];   }    					
    /**Visual J# */ 	/** @attribute 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.set_SelectCommand(new System.Data.SqlClient.SqlCommand("Select * From Authors", conn));		adapter.Fill(ds, "Authors");		System.Data.DataTableCollection dtc = ds.get_Tables();		return dtc.get_Item("Authors");	} 					
  2. Compile o XML Web service.
  3. Navegue até a URL do serviço XML da Web no qual você adicionou o código. Observe que você recebe uma mensagem de erro.
  4. Modificar o código seguinte para retornar um DataSet em vez de uma DataTable :
    'Visual Basic    <WebMethod()> 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;   }					
    /**Visual J# */ /** @attribute 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.set_SelectCommand(new System.Data.SqlClient.SqlCommand("Select * From Authors", conn));		adapter.Fill(ds, "Authors");		return ds;	}					
  5. Compile o XML Web service.
  6. Navegue até a URL do serviço XML da Web no qual você adicionou o código acima. Observe que você não recebe uma mensagem de erro.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 306134 - Última Revisão: 10/25/2004 17:06:01 - Revisão: 6.5

Microsoft Web Services (included with the .NET Framework) 1.0 , Microsoft Web Services Enhancements para Microsoft .NET 1.1, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft ASP.NET 1.0, Microsoft Visual J# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft ASP.NET 1.1

  • kbmt kbprb kbprod2web KB306134 KbMtpt
Comentários