Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tom55

[Resolvido] trabalhar com XML

Recommended Posts

olá galera....

 

eu tenho um sisteminha que está abrindo um arquivo xml, lendo nodos especificos(isso é necessário)

 

até ai tudo certo, tenho uma rotina que valida se os dados estão corretos e posteriormente insere no banco.

 

por falta de tempo(precisava ser entregue) fiz de um modo que se a linha estivesse correta, já enviasse para o banco, como não precisava me preocupar com o tempo(já que eu mesmo faço o monitoramento) fiz dessa maneira.

 

só que em um xml de 59mil items(nodos válidos para minha base) notei que ele estava inserindo apenas 39mil.

 

se eu transformo o xml para um xls e faço a importação, ele importa normalmente os 59mil!

 

também notei que ele não tem um padrão, pois ele pega a linha 23590 e não pega a 23591,23592, mas pega a 23593. notei isso ao fazer um teste dentro do meu laço que lê linha a linha!

 

existe alguma explicação lógica para esse fato?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara até onde sei não, mas pode ocorrer o seguinte.

Tem servidores onde se um recurso chegar a um pico alto de consumo do servidor, o servidor pode derrubar ou mesmo para o recurso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que e mais estranho e que ele nao interrompe.

 

Como eu comentei ele le a linha 25239 e nao le a a 25240, mas le a 25242!

 

Eu to achando que como o xml e muito grande, eu comeco a verificacao/insert antes de ele terminar de carregar, por isso o problema.

 

Existe algum modo de forcar a aplicacao em "espera" ate que uma determinada acao termine?

 

Vou tentar efetuar a importacao via procedure, para ver se resolve!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rafael,

 

Não está dando não....

 

como eu comentei, fiz mais teses e ao que parece ele pula algumas linhas no momento em que está carregando o XML. Fiz o teste carregando o xml para uma data table e coloquei uns if´s no meio para ver ele passar pelo registro que eu queria.

 

e digamos que ele está lá lendo, sem filtro nenhum, ele le +- assim

 

id nome

25340 joao

25341 leila

25345 maria

 

os registros 25342, 25343 e 25344 ele simplismente pula

Compartilhar este post


Link para o post
Compartilhar em outros sites

mudei um pouco o foco do meu teste e parei de tentar fazer a "via sacra" de verificar os dados...

 

parti para usar o openxml e a procedure sp_xml_preparedocument .

 

até ai tudo certo, testei um exemplo comum e deu certo, porém, quando eu coloco o meu xml(reduzido) ele dá o seguinte erro

 

Erro de análise XML 0xc00ce562 na linha número 1, próximo ao texto XML "<".
Msg 6602, Level 16, State 2, Procedure sp_xml_preparedocument, Line 1
A descrição do erro é 'Uma declaração não foi fechada.'.

 

eis o meu XML

 

<COMPRA>
<PRODUTO>
          <DESC>Desodorante</DESC>
          <PRECO>10</PRECO>
</PRODUTO>
     </COMPRA>

 

e já tentei sem a primeira linha <?xml version='1.0' encoding='ISO-8859-1'?> - Onde tem aspas simples eu mudei para " e também para duas aspas simples '' mas em ambos os testes o resultado foi o mesmo.

 

o xml ai de cima está com nomes trocados apenas para proteção de informação, mas a estrutura é a mesma.

 

mudei a tatica...

 

agora não tenho uma.... hahahaha

 

o open xml é bom, mas eu precisaria passar todo o string para a procedure rodar, pois ele não abre diretamente o xml. só que duvido ele ler um milhão de caracteres... acham que roda?

 

ou tem algum comando que eu possa utilizar para fazer o sistema "congelar" até que o arquivo seja totalmente carregado em memória?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver 90% dos meus problemas usando xml, resolvi todos do post anterior

 

agora o problema é que o SQL não aceita o formato de data que eu estou enviando e dá erro.

 

quando eu utilizo o mesmo formato, direto no SQL Server ele aceita, mas quando vai a string na programação e passa para a procedure(via código) dá erro.

 

alguma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara isso deve ser problema de globalization, tenta enviar em outro formato mm/dd/aaaa ou mm-dd-aaaa que deve resolver.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ivan....

 

Sigo com o problema

 

fiz o seguinte teste.

 

peguei parte do meu xml e joguei na minha SP

 

<COMPRA>
  <PRODUTO>
      <DESC>Desodorante</DESC>
      <PRECO>10</PRECO>
      <VALIDADE>12/25/2011</VALIDADE>
  </PRODUTO>
</COMPRA>

 

Usei esse formato de data: MM/dd/yyyy

 

Quando utilizo a SP para importar este XML para a base, ele funciona normalmente e importa os dados.

 

agora, quando executo a SP via codigo, me retorna o erro: "Erro de estouro aritimético ao converter expression no tipo de dados datetime".

 

se eu utilizo o formato para qual o banco está mostrando yyyy-MM-dd acontece o mesmo problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara fax o seguinte dentro da SP tenta fazer um convert na data: http://imasters.com.br/artigo/229/sql_server/trabalhando_com_datas_no_sql_server/

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, não é possível realizar um convert dentro de um openxml.

 

ai me dei conta de uma coisa... no meu openXML onde está o campo Data, eu estava marcando ele como datetime

 

 VALIDADE datetime 'DTVAL' 

 

troquei isso para

 

 VALIDADE varchar(10) 'DTVAL' 

 

e mandei a data via sistema normal, usando o padrão dd/mm/aaaa e funcionou no ambiente de desenvolvimento, mas no ambiente de produção não rolou ainda, estou fazendo mais uns testes

 

EDITANDO

 

pode marcar como resolvido!!!

 

eu havia esquecido de alterar a procedure em ambiente de produção!

 

achei que tinha rolado...

 

agora o problema é com os nodos....

 

eu tenho uma série de nodos para importar, mas eles estão em niveis diferentes, ai o openxml não aceita....

 

alguma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

o meu problema agora está no nivel dos nodos...

 

alguns registros estão em nodos diferentes, e com isso não consigo ler os mesmos.

 

até consigo ler, mas ele replica o primeiro registro para todos os outros.

 

bom....

 

consegui resolver, era somente ajuste de como ele estava lendo os nodos...

 

valeu!

 

agora sim podemos marcar como resolvido! hehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.