MELHOR PRTICA COM XML + READER

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

MELHOR PRTICA 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.

Porm, temo um WebService na qual podemos fazer algumas consultas, atravs dele.
Como no temos a inteno de reescrever os mtodos, estamos criando uma forma que coexista o mesmo cdigo em todos os lugares.

Porm, 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 serializao de um DataReader, basta desserializar como um DataReader...

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


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

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Na verdade, no.
Eu no tenho acesso ao webservice (cdigo fonte), mas, pelo que entendi ele cria um stream com o arquivo compactado e envia.
O cdigo em si que eu mostrei quando j recebo o xml e o que fao DEPOIS, e no a gerao do arquivo la no webservice.

A inteno transformar um arquivo puro xml em um sqldatareader, porque tem vrias chamadas pelo sistema, e no queramos mudar tudo ou ter que dar manuteno 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 desserializao. No vdeo, falo da NFe, mas serve para QUALQUER XML da mesma forma.

_______________________________________________________________________
Virei Orculo!
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 memria
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 serializvel por XML, tipos que herdam de IEnumerable devem ter uma implementao de Add(System.Object) nos nveis de sua hierarquia de herana. System.Data.SqlClient.SqlDataReader no 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.

_______________________________________________________________________
Virei Orculo!
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[] contm os dados que voc quer. At possvel 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>


_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


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

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Entendi, que no podemos mudar no lado de l.

Tambm 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, no vai.. creio que seja uma limitao por NO 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 especfico, sendo o retorno do mtodo []ExecuteReader[] da classe SqlCommand. Se voc j tem um []Tables[], porque precisa de um DataReader?

_______________________________________________________________________
Virei Orculo!
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 no ter que criar cdigo 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