XML gravar no banco
Bom dia!
Como faço para, tendo um arquivo XML, já lendo e visualizando em um DBGRID todas as colunas, utilizando CLIENTDATASET e DATASOURCE, gravar todas os dados em uma tabela no banco de dados, tabela criada conforme o XML, estrutura idêntica.
Isto é
1: Tenho uma tabela no banco do oracle X;
2: Acessando a tabela X através DBEXPRESS: SQLCONNECTION->SQLQUERY->DATASETPROVIDER->CLIENTDATASET; (normal)
3: Gero um arquivo XML através do CLIENTEDATASET: CDSSQL.SaveToFile('C:\TESTE.XML', dfXML); (normal)
4: Problema: Pego o arquivo TESTE.XML que contém as informações da tabela X e quero alimentar outra base de dados que tem a mesma estrutura, porém não tem os dados (IMPORTAR O XML PARA O BANCO DE DADOS). Pois estou lendo o arquivo TESTE.XML através do CLIENTDATASET normalmente e poderia varrer o arquivo linha a linha e fazer um INSERT dessas linha uma a uma, no entanto, gostaria é de importar de uma vez o arquivo XML, todos os registros, para o BANCO.
Existi como? E os XMLTransforms resolve? Como? Um exemplo por favor.
Hélio Marques.
Analista/Programador
Hélio Marques
Curtidas 0
Respostas
Rodrigo Mourão
03/03/2010
Olá Amigo,
Existir uma maneira de fazer isso de uma vez existe porderiamos usar o utilidato XMLMapper, ler a estrutura do XML Original e gerar um arquivo xtr colocando os dados em Insert. Feito isso utilizariamos um TXMLTRansformer para ler o XML original usar o xtr e passar para propriedade XMLData do CDS de destino os dados. No fim era so dar Applyupdates.
Isso é "lindo" mas se vc tiver que exportar 10 tabelas tera que gerar 10 arquivos xtr um para cada. Se amanha ou depois criar um novo campo num tabela ou alterar a ordem dos campos ou tipo dos campos terá que gerar novamente os xtr. Sem falar que nem sempre sai comoa gente quer.
Par aevitar estas dores de cabeças eu utilizo um rotina generica com 2 CDS um de Origem e um de DEstino. Veja se ela atende as suas necessidades:
var
I: Integer;
begin
CdsOrigem.LoadFromFile('arquivo.xml');
CdsOrigem.Open;
CdsOrigem.First;
while not CdsOrigem.EOF do
begin
for I := 0 to CdsOrigem.FieldCount - 1 do
begin
CdsDestino.Fields[I].Value := CdsOrigem.Fields[I].Value;
end;
CdsDestino.Post;
CdsOrigem.Next;
end;
CdsDestino.ApplyUpdates(0);
end;
Como a Origem vem do XML vc pode criar um procedure que pede um CDS como destino que deverá estar devidamente conectado a nova base. Assim a procedure poderá ser usada para qualquer XML mesmo que mude a ordem dos campos, nome, ou surjam novos campos. Mas lembre-se a estrutura das duas tabelas devem ser as mesmas.
Att,
Existir uma maneira de fazer isso de uma vez existe porderiamos usar o utilidato XMLMapper, ler a estrutura do XML Original e gerar um arquivo xtr colocando os dados em Insert. Feito isso utilizariamos um TXMLTRansformer para ler o XML original usar o xtr e passar para propriedade XMLData do CDS de destino os dados. No fim era so dar Applyupdates.
Isso é "lindo" mas se vc tiver que exportar 10 tabelas tera que gerar 10 arquivos xtr um para cada. Se amanha ou depois criar um novo campo num tabela ou alterar a ordem dos campos ou tipo dos campos terá que gerar novamente os xtr. Sem falar que nem sempre sai comoa gente quer.
Par aevitar estas dores de cabeças eu utilizo um rotina generica com 2 CDS um de Origem e um de DEstino. Veja se ela atende as suas necessidades:
var
I: Integer;
begin
CdsOrigem.LoadFromFile('arquivo.xml');
CdsOrigem.Open;
CdsOrigem.First;
while not CdsOrigem.EOF do
begin
for I := 0 to CdsOrigem.FieldCount - 1 do
begin
CdsDestino.Fields[I].Value := CdsOrigem.Fields[I].Value;
end;
CdsDestino.Post;
CdsOrigem.Next;
end;
CdsDestino.ApplyUpdates(0);
end;
Como a Origem vem do XML vc pode criar um procedure que pede um CDS como destino que deverá estar devidamente conectado a nova base. Assim a procedure poderá ser usada para qualquer XML mesmo que mude a ordem dos campos, nome, ou surjam novos campos. Mas lembre-se a estrutura das duas tabelas devem ser as mesmas.
Att,
GOSTEI 0