MELHOR PRÁTICA COM XML + READER

 Tópico anterior Próximo tópico Novo tópico

MELHOR PRÁTICA COM XML + READER

C#

 Compartilhe  Compartilhe  Compartilhe
#482257 - 12/06/2018 15:04:34

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Última edição em 12/06/2018 15:08:44 por CARINHENA

Pessoal, temos um sistema que tem classes de acesso a banco, ou seja, quando vc executa um comando usa essa e ela SEMPRE retorna como um SqlDataReader.

Porém, temo um WebService na qual podemos fazer algumas consultas, através dele.
Como não temos a intenção de reescrever os métodos, estamos criando uma forma que coexista o mesmo código em todos os lugares.

Porém, o webservice retorna um arquivo XML, na qual preenchemos:


// rotina que retornaria um sqlreader
DataSet ds = new DataSet();
string dsxml = "C:\\Logs\\data.xml"; //exemplo de arquivo criado pelo WebService

File.WriteAllText(dsxml, xml);
ds.ReadXml(dsxml);
File.Delete(dsxml);

Return  ds;


A pergunta é, qual a melhor forma (em termos de desempenho) para transformar esse arquivo xml em saida no estilo sqldatareader?


Carinhena

A melhor forma de aprender e ensinando!


Resposta escolhida #482259 - 12/06/2018 15:33:18

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Se este XML é uma serialização de um DataReader, basta desserializar como um DataReader...

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#482264 - 12/06/2018 16:26:24

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Na verdade, não.
Eu não tenho acesso ao webservice (código fonte), mas, pelo que entendi ele cria um stream com o arquivo compactado e envia.
O código em si que eu mostrei é quando já recebo o xml e o que faço DEPOIS, e não a geração do arquivo la no webservice.

A intenção é transformar um arquivo puro xml em um sqldatareader, porque tem várias chamadas pelo sistema, e não queríamos mudar tudo ou ter que dar manutenção em outras rotinas.




Carinhena

A melhor forma de aprender e ensinando!


#482265 - 12/06/2018 16:28:15

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Use desserialização. No vídeo, falo da NFe, mas serve para QUALQUER XML da mesma forma.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#482275 - 13/06/2018 08:53:52

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Eu vi o video com você serializando, o XML.

Dai eu tentei como:

  
//descompacta XML recebido e guarda em memória
var dados = Descompacta(xml);
//desserializa como SqlDataReader
SqlDataReader Dr = (SqlDataReader)new XmlSerializer(typeof(SqlDataReader)).Deserialize(new StringReader(dados));


Tentei como tipo reader, datatable.. mas, deu o mesmo erro:
'Para ser serializável por XML, tipos que herdam de IEnumerable devem ter uma implementação de Add(System.Object) nos níveis de sua hierarquia de herança. System.Data.SqlClient.SqlDataReader não implementa Add(System.Object).

Carinhena

A melhor forma de aprender e ensinando!


#482278 - 13/06/2018 09:10:47

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Coloque aqui o XML pra dar uma olhada.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#482279 - 13/06/2018 09:25:48

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Exemplo de 1:
  
<?xml version="1.0" encoding="utf-8"?>
<DataSet>
  <xs:schema id="Retorno" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="Retorno" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Dado">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Campo01" type="xs:decimal" minOccurs="0" />
                <xs:element name="Campo02" type="xs:dateTime" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <Retorno>
      <Dado diffgr:id="Dado1" msdata:rowOrder="0">
        <Campo01>22</Campo01>
      </Dado>
    </Retorno>
  </diffgr:diffgram>
</DataSet>


Carinhena

A melhor forma de aprender e ensinando!


#482280 - 13/06/2018 09:34:40

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe

Última edição em 13/06/2018 09:40:15 por KERPLUNK

O XML é um tipo "DataSet", "Retorno" contém os dados que você quer. Até é possível fazer uma manobra pra trazer isso em um DataReader, mas o correto é trazer o tipo que é mesmo(que é o tipo serializado) e se quiser, trazer "Retorno" em um List<T>


_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#482282 - 13/06/2018 10:14:38

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Entendi, é que não podemos mudar no lado de lá.

Também fiz de outra forma:


DataSet ds = new DataSet();
xml = Descompacta(xml);
StringReader theReader = new StringReader(xml);
ds.ReadXml(theReader);
return ds.Tables[0].CreateDataReader();


ou seja, ele retorna como um DataTableReader.

Porque como SqlDataReader, não vai.. creio que seja uma limitação por NÃO estar diretamente ligado a um banco.

Carinhena

A melhor forma de aprender e ensinando!


#482283 - 13/06/2018 10:26:24

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
SqlDataReader é um tipo específico, sendo o retorno do método "ExecuteReader" da classe SqlCommand. Se você já tem um "Tables", porque precisa de um DataReader?

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#482284 - 13/06/2018 10:57:51

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Só pra manter compatibilidade com o que usamos hoje.
Temos 2 projetos, e para não ter que criar código diferente, precisaria que fosse um datareader, para facilitar.

Carinhena

A melhor forma de aprender e ensinando!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por CARINHENA em 13/06/2018 16:17:59