Fórum XML gravar no banco #16855

03/03/2010

0

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

Hélio Marques

Responder

Posts

03/03/2010

Rodrigo Mourão

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,


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar