Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 09 de Setembro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
222 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Dicas]  Migração de dados entre bancos ou tabelas
Publicado por ActiveDelphi : Segunda, Junho 22, 2009 - 11:38 GMT-3 (2607 leituras)
Comentários 7 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador Esta é uma dica simples de como fazer migração de dados entre bancos ou entre tabelas diferentes, utilizando poucas linhas de código e deixando o trabalho maior na organização dos componentes

Você deve deixar os campos com as mesmas posições em seus componentes DataSet de origem e destino (componentes que farão a leitura de uma tabela e edição na outra). Este DataSet, obviamente pode ser um TQuery, TTable, TIBQuery, TADOQuery, TClientDataSet ou, enfim, qualquer outro componente descendente da classe TDataSet.

Vamos supor que estamos fazendo a migração de um banco Access para Firebird. Para acessar o Access, usaremos um ADOQuery, e para Firebird, ClientDataSet.

Feitas as conexões, o que precisamos fazer é organizar os campos no ADOQuery e no ClientDataSet para que fiquem com as mesmas posições, ou seja, campo[0] do ADOQuery equivale ao campo[0] no ClientDataSet, assim como os demais, campo[1], campo[2], etc.

Organizados os campos, o seguinte código seria suficiente para transferir os dados entre as tabelas:

//código do botão "Transferir"
var
  c: integer;
begin
  //abre a tabela Destino
  ClientDataSet1.Open;
  //abre a tabela Origem
  ADOQuery1.Open;
  //enquanto não chegar ao fim da origem
  while not ADOQuery1.EOF do
  begin

    //abre um novo registro no destino
    ClientDataSet1.Append;
    //para cada campo da tabela destino
    for c := 0 to ClientDataSet1.FieldCount-1 do
      //preenche cada campo com seu valor respectivo da origem
      //ClientDataSet1.Fields[c].Value := ClientDataSet1.Fields[c].Value;
      //Corrigido em 16/07/2009 15:45
      ClientDataSet1.Fields[c].Value := ADOQuery1.Fields[c].Value;
    //grava o registro na tabela destino (em memória)
    ClientDataSet1.Post;
    //confirma as alterações no banco de dados
    //(desnecessário se não for um ClientDataSet)

    ClientDataSet1.ApplyUpdates(0);
    //vai para o próximo registro da origem
    ADOQuery1.Next;
  end;
  //fecha a origem
  ADOQuery1.Close;
  //fecha o destino
  ClientDataSet1.Close;
end;

E é isso aí! Espero que seja útil.

[]'s
Carlos (karlosrapanui)
Contato: karlosrapanui@hotmail.com



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: tembra (claubertembra@hotmail.com) : Jun 27, 2009 - 09:50
(Informações sobre o membro | Enviar uma mensagem) http://
Amigo, em qual linha é gravado o conteúdo da tabela ADOQuery1 para ClientDataSet1? O que ví no código foi a transferência de ClientDataSet1 para ClientDataSet1. Por favor me corrija se eu estiver errado!


por: karlosrapanui (karlosrapanui@hotmail.com) : Jul 02, 2009 - 08:06
(Informações sobre o membro | Enviar uma mensagem)
//código do botão "Transferir"
var
c: integer;
begin
//abre a tabela Destino
ClientDataSet1.Open;
//abre a tabela Origem
ADOQuery1.Open;
//enquanto não chegar ao fim da origem
while not ADOQuery1.EOF do
begin
//abre um novo registro no destino
ClientDataSet1.Append;
//para cada campo da tabela destino
for c := 0 to ClientDataSet1.FieldCount-1 do
//preenche cada campo com seu valor respectivo da origem
ClientDataSet1.Fields[c].Value := ADOQuery1.Fields[c].Value;
//grava o registro na tabela destino (em memória)
ClientDataSet1.Post;
//confirma as alterações no banco de dados
//(desnecessário se não for um ClientDataSet)
ClientDataSet1.ApplyUpdates(0);
//vai para o próximo registro da origem
ADOQuery1.Next;
end;
//fecha a origem
ADOQuery1.Close;
//fecha o destino
ClientDataSet1.Close;
end;



por: 1v4n! (ivan.pantoja@tjap.jus.br) : Jul 02, 2009 - 02:13
(Informações sobre o membro | Enviar uma mensagem) http://
Eu achei muito bom essa questao de transferencia de banco de dados. Valeu ai pela dica.
Continue assim.


por: josecarlos (josecarlos@unifamma.edu.br) : Jul 07, 2009 - 07:46
(Informações sobre o membro | Enviar uma mensagem) http://http://
Olá gostei desta dica, ela esta me dando uma luz, pois tenho um banco de dados Access com cadastros de alunos, e estou tentando exportar para o SQL Server 2005, baseado nesta dica do Carlos poderá tornar minha tarefa menos ardua.
Parabens Carlos pela dica.


por: paulinhofeix (paulinhofeix@gmail.com) : Jul 09, 2009 - 10:36
(Informações sobre o membro | Enviar uma mensagem) http://http://
Bom dia, vc deixou o ClientDataSet1.ApplyUpdates(0); dentro do loop, não seia melhor por desta parte.
//vai para o próximo registro da origem
ADOQuery1.Next;
end;
ClientDataSet1.ApplyUpdates(0);
//fecha a origem
ADOQuery1.Close;
//fecha o destino
ClientDataSet1.Close;
Desta forma vc não tem perda de performase.
-------------------------------------------------
Eu ja Prefiro faser desta forma.

Parcelas.ControlsDisabled; //--Desta forma fica mais rapido, não tem perca de performase
with Parcelas do
begin
first ;
while not eof do
begin
CuentaCliente.Append;
CuentaClienteDEBITO.AsFloat := ParcelasVALOR.AsFloat;
CuentaClienteSALDO.AsFloat := ParcelasVALOR.AsFloat;
CuentaClienteRECEBIDO.AsFloat := 0;
CuentaClienteVCTO.AsDateTime := ParcelasVCTO.AsDateTime;
CuentaClienteHISTORICO.AsString := ParcelasHISTORICO.AsString;
Post;
Next;
end;
Parcelas.EnableControls; // Aqui eu abelito de novo os controles visuais...
CuentaCliente.ApplyUpdates(0);
end;



por: KMerlotti (kelver@activedelphi.com.br) : Jul 16, 2009 - 04:05
(Informações sobre o membro | Enviar uma mensagem) http://www.kmerlotti.hpg.com.br
Artigo corrigido! ;-)

Quando detectarem alguma falha do tipo, é só me avisarem por e-mail (kelver@activedelphi.com.br) que eu atualizo o site, ok?

Obrigado ao "tembra" pela identificação do problema e ao "karlosrapanui" (autor do material) pela correção.

Um abraço a todos!
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados