Microsoft Developer Network > Página Inicial dos Fóruns > Fóruns do Web Development > ASP .NET > ERRO ao retornar DataTable, criada via código, em um Web Service
Fazer uma PerguntaFazer uma Pergunta
 

RespondidoERRO ao retornar DataTable, criada via código, em um Web Service

  • sexta-feira, 6 de novembro de 2009 11:51Thiago Giannini Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Contém Código
    Eu estou criando um DataTable via código para ser retornado por Web Service. Esse Web Service já retorna outros Objetos DataTable mas nenhum criado via código. A mensagem derro é apresentada abaixo quando a função do web service é acionada:

    Descrição: Ocorreu uma exceção não tratada durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.

    Detalhes da Exceção: System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: O servidor não pôde processar a solicitação. ---> System.InvalidOperationException: Erro ao gerar o documento XML. ---> System.InvalidOperationException: Não é possível serializar a DataTable. Nome de DataTable não definido.
      em System.Data.DataTable.WriteXmlSchema(XmlWriter writer, Boolean writeHierarchy)
      em System.Data.DataTable.System.Xml.Serialization.IXmlSerializable.WriteXml(XmlWriter writer)
      em System.Xml.Serialization.XmlSerializationWriter.WriteSerializable(IXmlSerializable serializable, String name, String ns, Boolean isNullable, Boolean wrapped)
      em Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write17_RetornaFichaIndividualResponse(Object[] p)
      em Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer29.Serialize(Object objectToSerialize, XmlSerializationWriter writer)
      em System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
      --- Fim do rastreamento de pilha de exceções internas ---
      em System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
      em System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle)
      em System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
      em System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
      em System.Web.Services.Protocols.WebServiceHandler.Invoke()
      --- Fim do rastreamento de pilha de exceções internas ---

    Erro de Origem:

    Linha 394:        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RetornaFichaIndividual", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    Linha 395: public System.Data.DataTable RetornaFichaIndividual(System.Guid gIDMatricula, System.Guid gApplicationid) {
    Linha 396: object[] results = this.Invoke("RetornaFichaIndividual", new object[] {
    Linha 397: gIDMatricula,
    Linha 398: gApplicationid});

Respostas

Todas as Respostas

  • sexta-feira, 6 de novembro de 2009 11:53Seilor Bonancio Junior Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido
    Olá datatable não é serializado pelo webservice, vc teria que seriliazar na mão ele para passar,mais passa ele para dataset que vai dar certo e é mais fácil.
  • sexta-feira, 6 de novembro de 2009 12:02kauebranco Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido
    Somente completando a resposta do Seilor(que está correta), segue:

    Um DataTable não pode ser serializado(Referência):
    http://support.microsoft.com/default.aspx/kb/306134 

    Para colocar o seu DataTable em um DataSet faça assim:

    DataSet ds = new DataSet();
    ds.Tables.Add(seuDataTable);

    return ds; //e não esqueça de mudar o retorno do seu método do WebService para DataSet.

  • sexta-feira, 6 de novembro de 2009 13:57William John Adam Trindade Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido
    Olá

    Complementando a resposta do Seilor(que esta parcialmente correta) o datatable é "serializable" a partir do .NET 2.0.
    O artigo 306134 é valido para o .NET 1.0 (veja bem embaixo no artigo onde diz aplica-se à:)

    Olhe o artigo "novidades do ADO.NET 2.0"
    http://msdn.microsoft.com/en-us/library/ex6y04yf(VS.80).aspx

    DataTable as a Stand-Alone Object

    • Many methods that were only available in the DataSet in previous versions are now available in the DataTable as well (such as ReadXml and WriteXml). Also, a DataTable can be serialized by itself, so it’s no longer necessary to have a DataSet with a single table just to expose the table through Web services or any other mechanism that requires serialization.


    Bom, mas eu sou de acordo com retornar um Dataset, porque tambem a implementaçao do retorno de um data table nao é nada trivial
    http://social.msdn.microsoft.com/forums/en-US/asmxandxml/thread/1e4a85db-b1e3-46a2-a7f1-2b1c0c0adb8b/


    Att




    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------
    Téléphone: (819) 379-3446
    Télécopieur: (819) 379-3449
    triw@sogi.com.no_spam
    ----------------------------------------------------------
    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
  • sábado, 7 de novembro de 2009 14:40Erysson Barros Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

    Fale,

    Já trabalhei com WebService e o retorno que o mesmo estava fazendo era de um dataset o bacana é que se executar uma storedprocedure que tem vários selects o mesmo retorna para o dataset como várias tabelas.

    Abraço!


    Se a resposta solucionar sua dúvida, favor - Votar como Útil Abraço!