Urgentissimo
Ola wesley ,
Como voce ve abaixo fiz um rotina para exportar dados de um banco firebird para sql, é aquele negocio do identificador.
Estou tentando no momento que o programa do cara la registrar uma nova chamada eu tranporte ela na mesma hora para o sqlserver.
Como voce abaixo fiz a rotina , quase tudo certo so que da aquele tal de deadlock , ao meu entender isso acontece quando duas pessoas tentao alter o mesmo registo.
Da uma olhada nesse codigo e me diz o que esta errado ai.
Sempre que entra uma nova chamada no banco do kara la , eu busco ele transfiro para o sqlserver e seto o estatus com 'f' , afinal preciso de um criterio para nao copiar coisas repetidas.
Da uma força amigo veja o que estou fazendo de errado.
Ja adiantando eu vou precisar rodar isso futuramente como serviço pois no evento timer pesa demais a aplicaçao , seria possivel futuramente voce me ajudar e criar um serviço ?
procedure TfrmMigracaoFirebird.tmrTesteTimer(Sender: TObject);
begin
dsTodasLinhasF.DataSet.close;
dsTodasLinhasF.DataSet.Open; Dmfirebird.cdsTodasLinhasf.First;
while not Dmfirebird.cdsTodasLinhasf.Eof do
begin
with Dmfirebird do
begin
cdsTodasLinhasSQl.Open;
cdsTodasLinhasSQl.Append;
cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
cdsTodasLinhasSQlId_Usuario.AsString := '1';
cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
cdsTodasLinhasf.Next;
cdsTodasLinhasSQl.Post;
end;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
Dmfirebird.cdsTodasLinhasSQl.EmptyDataSet;
end; Dmfirebird.cdsTodasLinhasf.First;
while not Dmfirebird.cdsTodasLinhasf.Eof do
begin
Dmfirebird.cdsTodasLinhasf.Edit;
Dmfirebird.cdsTodasLInhasFESTATUS.AsString := 'f';
Dmfirebird.cdsTodasLinhasf.Next;
end; Dmfirebird.cdsTodasLinhasf.ApplyUpdates(0);
Dmfirebird.cdsTodasLinhasf.EmptyDataSet; dsTodasLinhasSQl.DataSet.close;
dsTodasLinhasSQl.DataSet.Open; lblsql.Caption := IntToStr(dsTodasLinhasSQl.DataSet.RecordCount); end;
begin
dsTodasLinhasF.DataSet.close;
dsTodasLinhasF.DataSet.Open; Dmfirebird.cdsTodasLinhasf.First;
while not Dmfirebird.cdsTodasLinhasf.Eof do
begin
with Dmfirebird do
begin
cdsTodasLinhasSQl.Open;
cdsTodasLinhasSQl.Append;
cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
cdsTodasLinhasSQlId_Usuario.AsString := '1';
cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
cdsTodasLinhasf.Next;
cdsTodasLinhasSQl.Post;
end;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
Dmfirebird.cdsTodasLinhasSQl.EmptyDataSet;
end; Dmfirebird.cdsTodasLinhasf.First;
while not Dmfirebird.cdsTodasLinhasf.Eof do
begin
Dmfirebird.cdsTodasLinhasf.Edit;
Dmfirebird.cdsTodasLInhasFESTATUS.AsString := 'f';
Dmfirebird.cdsTodasLinhasf.Next;
end; Dmfirebird.cdsTodasLinhasf.ApplyUpdates(0);
Dmfirebird.cdsTodasLinhasf.EmptyDataSet; dsTodasLinhasSQl.DataSet.close;
dsTodasLinhasSQl.DataSet.Open; lblsql.Caption := IntToStr(dsTodasLinhasSQl.DataSet.RecordCount); end;
Carlos Faria
Curtidas 0
Respostas
Wesley Yamazack
13/07/2010
Carlos,
O problema é que deadlock acontece no banco de dados, o componente deste camarada, deve travar o registro e não liberar o mesmo. Pois deadlock é quando o banco de dados bloqueia um registro que esta aberto, por outra pessoa.
O erro acontece em que linha ?
Att.
Wesley Y
O problema é que deadlock acontece no banco de dados, o componente deste camarada, deve travar o registro e não liberar o mesmo. Pois deadlock é quando o banco de dados bloqueia um registro que esta aberto, por outra pessoa.
O erro acontece em que linha ?
Att.
Wesley Y
GOSTEI 0
Carlos Faria
13/07/2010
Eu Nao consegui identificar een linha , na da em todas impasse als Linhas verdade als vezes e quando da trava tudo.Dei uma melhorada geen Codigo aqui , tudo que fazer preciso agora e quando o que cdssqlserver der um applyupdate ele o cdsfirebird set para o estatus 'F 'nee Banco firebird.ao meu ver acho que isso Iria resolver.so nao consegui fazer o loop certo
TfrmMigracaoFirebird.tmrTesteTimer procedure (Sender: TObject);
var
T: Ttransactiondesc ;
beginnen proberen
Dmfirebird.dbAcessoFirebird.StartTransaction (T) ;
Dmfirebird.cdsTodasLinhasf.First ;
terwijl niet Dmfirebird.cdsTodasLinhasf.Eof doen
beginnen
met Dmfirebird doen
beginnen
cdsTodasLinhasSQl.Open ;
cdsTodasLinhasSQl.Append ;
cdsTodasLinhasSQlNr_Linha.AsInteger : = cdsTodasLInhasFLinha.AsInteger ;
cdsTodasLinhasSQlDS_DDD.AsString : = cdsTodasLInhasFDDD.AsString ;
cdsTodasLinhasSQlDs_Fone.AsString : = cdsTodasLInhasFFone.AsString ;
cdsTodasLinhasSQlDs_Nome.AsString : = cdsTodasLInhasFNome.AsString ;
cdsTodasLinhasSQlHr_Inicio.AsString : = cdsTodasLInhasFInicio.AsString ;
cdsTodasLinhasSQlHr_Fim.AsString : = cdsTodasLInhasFFim.AsString ;
cdsTodasLinhasSQlTempoTotal.AsString : = cdsTodasLInhasFTempoTotal.AsString ;
cdsTodasLinhasSQlFileRecord.AsString : = cdsTodasLInhasFFileRecord.AsString ;
cdsTodasLinhasSQlTipo.AsInteger : = cdsTodasLInhasFTipo.AsInteger ;
cdsTodasLinhasSQlId_Usuario.AsString : = '1 ' ;
cdsTodasLinhasSQlFiltro.AsString : = cdsTodasLInhasFFiltro.AsString ;
cdsTodasLinhasSQlTipoCH.AsString : = cdsTodasLInhasFTipoCH.AsString ;
cdsTodasLinhasSQlOPR.AsString : = cdsTodasLInhasFOPR.AsString ;
cdsTodasLinhasf.Next ;
cdsTodasLinhasSQl.Post ;
einde te maken;
einde te maken;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates (0);
Dmfirebird.dbAcessoFirebird.Commit (T) ;
behalve
Dmfirebird.dbAcessoFirebird.Rollback (T) ;
einde te maken;
var
T: Ttransactiondesc ;
beginnen proberen
Dmfirebird.dbAcessoFirebird.StartTransaction (T) ;
Dmfirebird.cdsTodasLinhasf.First ;
terwijl niet Dmfirebird.cdsTodasLinhasf.Eof doen
beginnen
met Dmfirebird doen
beginnen
cdsTodasLinhasSQl.Open ;
cdsTodasLinhasSQl.Append ;
cdsTodasLinhasSQlNr_Linha.AsInteger : = cdsTodasLInhasFLinha.AsInteger ;
cdsTodasLinhasSQlDS_DDD.AsString : = cdsTodasLInhasFDDD.AsString ;
cdsTodasLinhasSQlDs_Fone.AsString : = cdsTodasLInhasFFone.AsString ;
cdsTodasLinhasSQlDs_Nome.AsString : = cdsTodasLInhasFNome.AsString ;
cdsTodasLinhasSQlHr_Inicio.AsString : = cdsTodasLInhasFInicio.AsString ;
cdsTodasLinhasSQlHr_Fim.AsString : = cdsTodasLInhasFFim.AsString ;
cdsTodasLinhasSQlTempoTotal.AsString : = cdsTodasLInhasFTempoTotal.AsString ;
cdsTodasLinhasSQlFileRecord.AsString : = cdsTodasLInhasFFileRecord.AsString ;
cdsTodasLinhasSQlTipo.AsInteger : = cdsTodasLInhasFTipo.AsInteger ;
cdsTodasLinhasSQlId_Usuario.AsString : = '1 ' ;
cdsTodasLinhasSQlFiltro.AsString : = cdsTodasLInhasFFiltro.AsString ;
cdsTodasLinhasSQlTipoCH.AsString : = cdsTodasLInhasFTipoCH.AsString ;
cdsTodasLinhasSQlOPR.AsString : = cdsTodasLInhasFOPR.AsString ;
cdsTodasLinhasf.Next ;
cdsTodasLinhasSQl.Post ;
einde te maken;
einde te maken;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates (0);
Dmfirebird.dbAcessoFirebird.Commit (T) ;
behalve
Dmfirebird.dbAcessoFirebird.Rollback (T) ;
einde te maken;
GOSTEI 0
Carlos Faria
13/07/2010
procedure TfrmMigracaoFirebird.tmrTesteTimer(Sender: TObject);
var
T: Ttransactiondesc;
begin try
Dmfirebird.dbAcessoFirebird.StartTransaction(T);
Dmfirebird.cdsTodasLinhasf.First;
while not Dmfirebird.cdsTodasLinhasf.Eof do
begin
with Dmfirebird do
begin
cdsTodasLinhasSQl.Open;
cdsTodasLinhasSQl.Append;
cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
cdsTodasLinhasSQlId_Usuario.AsString := '1';
cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
cdsTodasLinhasf.Next;
cdsTodasLinhasSQl.Post;
end;
end;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
Dmfirebird.dbAcessoFirebird.Commit(T);
except
Dmfirebird.dbAcessoFirebird.Rollback(T);
end;
var
T: Ttransactiondesc;
begin try
Dmfirebird.dbAcessoFirebird.StartTransaction(T);
Dmfirebird.cdsTodasLinhasf.First;
while not Dmfirebird.cdsTodasLinhasf.Eof do
begin
with Dmfirebird do
begin
cdsTodasLinhasSQl.Open;
cdsTodasLinhasSQl.Append;
cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
cdsTodasLinhasSQlId_Usuario.AsString := '1';
cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
cdsTodasLinhasf.Next;
cdsTodasLinhasSQl.Post;
end;
end;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
Dmfirebird.dbAcessoFirebird.Commit(T);
except
Dmfirebird.dbAcessoFirebird.Rollback(T);
end;
GOSTEI 0
Wesley Yamazack
13/07/2010
Carlos, por que você esta abrindo todo momento no loop o cdstotdaslinhasSQL? Que erro acontece ?
procedure TfrmMigracaoFirebird.tmrTesteTimer(Sender: TObject);
var
T: Ttransactiondesc;
begin try
Dmfirebird.dbAcessoFirebird.StartTransaction(T);
Dmfirebird.cdsTodasLinhasf.First; cdsTodasLinhasSQl.Open; while not Dmfirebird.cdsTodasLinhasf.Eof do
begin
with Dmfirebird do
begin
cdsTodasLinhasSQl.Append;
cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
cdsTodasLinhasSQlId_Usuario.AsString := '1';
cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
cdsTodasLinhasf.Next;
cdsTodasLinhasSQl.Post;
end;
end;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
Dmfirebird.dbAcessoFirebird.Commit(T);
except
Dmfirebird.dbAcessoFirebird.Rollback(T);
end;
Aparentemente esta tudo ok.
Att,
Wesley Y
procedure TfrmMigracaoFirebird.tmrTesteTimer(Sender: TObject);
var
T: Ttransactiondesc;
begin try
Dmfirebird.dbAcessoFirebird.StartTransaction(T);
Dmfirebird.cdsTodasLinhasf.First; cdsTodasLinhasSQl.Open; while not Dmfirebird.cdsTodasLinhasf.Eof do
begin
with Dmfirebird do
begin
cdsTodasLinhasSQl.Append;
cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
cdsTodasLinhasSQlId_Usuario.AsString := '1';
cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
cdsTodasLinhasf.Next;
cdsTodasLinhasSQl.Post;
end;
end;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
Dmfirebird.dbAcessoFirebird.Commit(T);
except
Dmfirebird.dbAcessoFirebird.Rollback(T);
end;
Aparentemente esta tudo ok.
Att,
Wesley Y
GOSTEI 0
Carlos Faria
13/07/2010
Eu abro o loop, pq estou buscando dados de 6 tabelas diferentes, pode ter so um registro ou podem ter varios entao a necessidade do loop
GOSTEI 0
Wesley Yamazack
13/07/2010
Carlos,
Você ta usando um timer é isso ?
O timer vai disparar este evento a todo momento, e se tiverem 100 regisotrs na tabela, toda hora que ele passar no loop ele vai abrir a tabela novamente, isso não esta me parecendo correto, entendeu ?
Att,
Wesley Y
Você ta usando um timer é isso ?
O timer vai disparar este evento a todo momento, e se tiverem 100 regisotrs na tabela, toda hora que ele passar no loop ele vai abrir a tabela novamente, isso não esta me parecendo correto, entendeu ?
Att,
Wesley Y
GOSTEI 0
Wesley Yamazack
13/07/2010
Carlos, só para lembrar, como estamos com este chamado aqui ?
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0