|
Usuários |
|
222 Usuários Online
|
|
[Dicas]
Migração de dados entre bancos ou tabelas |
Publicado por ActiveDelphi : Segunda, Junho 22, 2009 - 11:38 GMT-3 (2607 leituras)
7 Comentários Enviar para um amigo Versão para impressão
|
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 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: 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: karlosrapanui (karlosrapanui@hotmail.com) : Jul 13, 2009 - 07:56 (Informações sobre o membro | Enviar uma mensagem) | Valeu pela sua orientação, porem o motivo principal desse processo é o de replicar uma tabela com campos identicos de uma só vez.
Dessa maneira que vc colocou vc tem que passar todos os campos da tabela, o que justamente estamos evitando no processo.
[]'s | [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|