PEGAR RECORDSET DE UM BANCO E ATUALIZAR OUTRO BANC

LUIS.HERRERA 13/05/2011 11:06:21
#373864
Bom dia, estou tendo de migrar todos os dados de um banco para outro com algumas mudanças de estrutura (DB Access)

Estão para não ter de pegar tabela por tabela e depois inserir ou atualizar registro a registro no novo DB, pensei se é possível abrir um Recordset (Select) do banco origem com todos os registros e depois desconectar e reconectar esse recordset no novo banco e dar um update para atualizar, mas da forma que fiz não funcionou. Não deu erro nenhum, mas a tabela não foi atualizada.
Nota: Tenho de fazer um aplicativo só para isso, pois preciso atualizar bancos em clientes diferentes.

rs1.Open [Ô]SELECT campoID, campo1, campo2 FROM minhaTabelaOrigem ORDER BY campoID[Ô], cnDBUso, adOpenDynamic, adLockPessimistic, adCmdTableDirect
If Not rs1.EOF Then
Set rs1.ActiveConnection = Nothing [ô]desconectando banco origem
Set rs1.ActiveConnection = cnDBLimpo [ô]reconectando banco novo
rs1.Update [ô]tendando atualizar os dados
End If

Será que isso não é possível?
Vou ter que fazer isso gravando registro por registro?

Obrigado
Luis
FEDERHEN 13/05/2011 11:34:52
#373865
Provavelmente quando você [Ô]reconecta[Ô] o recordset no banco novo, ele faz um refresh do novo banco e como lá não tem registros, o recordset fica com zero registros após o [Ô]reconect[Ô].
ROBIU 13/05/2011 13:39:26
#373874
Da forma que está fazendo, vai precisar de duas conexões. Tenta uma das formas abaixo:
1. Pega os dados e joga em u grid, pega do grid e joga no novo banco.
2. Joga os dados em um recordset desconectado e manda para o novo banco.

Veja aqui - Trabalhando com Recordsets sem uma base de dados
LUIS.HERRERA 13/05/2011 17:08:58
#373887
Roberto mas eu já estou fazendo isso, veja que no código que passei está assim. O Recordset é desconectado da primeira conexão (banco 1) e reconectado na segunda conexão banco 2

Set rs1.ActiveConnection = Nothing [ô]desconectando banco origem cnDBUso
Set rs1.ActiveConnection = cnDBLimpo [ô]reconectando banco novo.

Agora não sei se ao reconectar ao novo DB o recordset poder atualizar as tabelas dele com um update?
Também não sei se os parâmetros da conexão usada permite isso no MS Access
adOpenDynamic, adLockPessimistic, adCmdTableDirect

LUIS
TECLA 13/05/2011 18:02:04
#373896
Porque você não cria um clone do Recordset, ou seja, crie um novo objeto com os dados do primeiro.
LUIS.HERRERA 14/05/2011 14:40:57
#373932
Tecla não entendi? Como assim?

Veja eu fiz o Select no banco 1 e queria pegar esse mesmo recordset e atualizar o banco 2 (onde podem existir registros para serem alterados (atualizar os dados) e/ou inseridos quando há mais dados, isso porque algumas tabelas são enviadas com dados padrão e outras vazias, por isso na migração de uma tabela entre os bancos podem ocorrer só Inserts ou Updates + Inserts na mesma tabela.

Eu montei da seguinte forma, mas ficou lento o processo, já que são 46 tabelas e algumas podem conter milhares de registros.

1- abro a conexão 1
2- abro a conexão 2
3- rs select na tabela 1 coneão 1
4- loop pelo rs e Insert na conexão 2 (registro a registro)
5- fecha rs
6- abre rs com select na tabela 2 conexão 1 e repete todo processo até a última tabela.

Só que dar um insert registro a registro em cada tabela, demora muito e sobrecarrega a conexão da rede. Não sei como quantificar isso, mas a demora no processo é evidente e como as conexões variam de empresa para empresa, algumas podem demorar muito mais do que nos meus testes com dois micros locais.

Por esse motivo queria saber se há como fazer o rs do select transferir todos os dados de uma vez para o banco novo e assim fugir do processo atual demorado?

TECLA 14/05/2011 19:08:48
#373939
Os dois bancos estão [Ô]local[Ô]?
Os dois são Access?
JESUEL.OLIVEIRA 15/05/2011 10:23:22
#373966
Amigo, se o BD suportar faça um SELECT com INSERT.

   
INSERT INTO 'respostas' (IDENVIO, NOME, IDDESTINO)
SELECT xoops_users.uid, xoops_users.uname,
xoops_xoopscomments.com_id
FROM xoops_users, xoops_xoopscomments
WHERE xoops_users.uid = xoops_xoopscomments.com_uid



é só você esta conectado nos dois bancos, se você usar a transação BeginTrans e CommitTrans, RollbackTrans se houver falha você confirma ou não a inserção.

Fica ai minha sugestão
LUIS.HERRERA 15/05/2011 11:28:46
#373975
TECLA
Os dois bancos são Access e estão em rede na mesma pasta. O EXE também está na rede (facilitar manutenção), mas rodando localmente via atalho, pois suas dependências estão local também.

Josuel acho que nenhum banco aceita isso, mesmo porque ao se abrir um recordset é associado a uma conexão e como são dois bancos, não vejo como associar os dois.
Andei monitorando o tempo como está, gravando registro a registro por loop, e o tempo varia de 10 a 20 minutos.

O que estou achando mais esquisito, é que inicialmente estou simulando a rede via máquina virtual com o Host Win seven e a estação com XP. Porém em algumas tarefas há uma parada no processamento, com a barra de progresso ficando imóvel, só volta se eu mover o Mouse, muito estranho, não há nada no código para isso, será problema da máquina virtual ? (MS Virtual PC para Windows Seven).
Tópico encerrado , respostas não são mais permitidas