Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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!
Não está dando timeout no seu insert?
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
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?
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?
Cara isso deve ser problema de globalization, tenta enviar em outro formato mm/dd/aaaa ou mm-dd-aaaa que deve resolver.
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
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/
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?
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
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.