ERRO ao retornar DataTable, criada via código, em um Web Service
- 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
- 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.
- Marcado como RespostaHarley AraujoMSFT, Moderadorterça-feira, 10 de novembro de 2009 11:45
- EditadoSeilor Bonancio Junior sexta-feira, 6 de novembro de 2009 17:44Correção
- 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.- Marcado como RespostaHarley AraujoMSFT, Moderadorterça-feira, 10 de novembro de 2009 11:45
- 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)- Marcado como RespostaHarley AraujoMSFT, Moderadorterça-feira, 10 de novembro de 2009 11:45
-
Todas as Respostas
- 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.
- Marcado como RespostaHarley AraujoMSFT, Moderadorterça-feira, 10 de novembro de 2009 11:45
- EditadoSeilor Bonancio Junior sexta-feira, 6 de novembro de 2009 17:44Correção
- 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.- Marcado como RespostaHarley AraujoMSFT, Moderadorterça-feira, 10 de novembro de 2009 11:45
- 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)- Marcado como RespostaHarley AraujoMSFT, Moderadorterça-feira, 10 de novembro de 2009 11:45
-
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!

