Fórum migrando dados - problema com dataset #349078
16/11/2007
0
ola,
bem ,estou migrando dados de uma tabela para a outra. Ambas possuem uma estrutura identica. O problema que ando enfrentando, e que quando vou compilar o programa, da um erro chamado ´Cannot perform this operation on a closed dataset.´ Uso dois banco de dados diferentes, dois Firebird.
Abaixo , o codigo.
bem ,estou migrando dados de uma tabela para a outra. Ambas possuem uma estrutura identica. O problema que ando enfrentando, e que quando vou compilar o programa, da um erro chamado ´Cannot perform this operation on a closed dataset.´ Uso dois banco de dados diferentes, dois Firebird.
Abaixo , o codigo.
function RetornaTipo(Campo:TFieldType):string; begin case campo of ftUnknown: result:=´Desconhecido´ ; ftString: result := ´Varchar´; ftSmallint: result := ´Integer´; ftInteger: result := ´Integer´ ; ftWord: result := ´Integer´; ftBoolean: result := ´Char(1)´; ftFloat: result :=´DOUBLE PRECISION´; ftCurrency: result :=´DOUBLE PRECISION´; ftBCD: result :=´DOUBLE PRECISION´; ftDate: result :=´Timestamp´; ftTime: result :=´TimeStamp´; ftDateTime: result :=´TimeStamp´; ftBytes: result :=´integer´ ; ftVarBytes: result :=´integer´; ftAutoInc: result :=´Integer´; ftBlob: result :=´Blob´; ftMemo: result :=´Blob´; ftGraphic: result :=´Blob´; ftFmtMemo: result :=´Blob´; ftParadoxOle: result :=´Blob´; ftDBaseOle: result :=´Blob´; ftTypedBinary: result :=´Integer´; ftCursor: result :=´Integer´; ftFixedChar: result :=´Char´; ftWideString: result :=´Varchar´; ftLargeint: result :=´integer´; ftADT: result :=´blob´; ftArray: result :=´blob´; ftReference: result :=´blob´; ftDataSet: result :=´blob´; ftOraBlob: result :=´Blob´; ftOraClob: result :=´Blob´; ftVariant: result :=´blob´; ftInterface: result :=´blob´; ftIDispatch: result :=´´; ftGuid: result :=´´; ftTimeStamp: result :=´TimeStamp´; ftFMTBcd: result :=´blob´; ftFixedWideChar: result :=´Char´; ftWideMemo: result :=´Blob´; ftOraTimeStamp: result :=´TimeStamp´; ftOraInterval: result :=´integer´; end; end; ////////// Procedures //////////// procedure TFPrincipal.LerIni(var CaminhoBDANTIGO: string); // Procedure para ler o arquivo INI. // Variaveis globais usadas sao: // CaminhoBDANTIGO : String; // CaminhoArquivoIni : TIniFile; begin CaminhoArquivoIni := TIniFile.Create(´E:\BD\consultorio.ini´); //Atribuindo o caminho a variavel. CaminhoBDANTIGO := CaminhoArquivoIni.ReadString(´BancoDados´, ´local_Text´, CaminhoBDANTIGO); //Assimilando o valor a Variavel CaminhoDBANTIGO. CaminhoArquivoIni.Free; //Liberando... if (CaminhoBDANTIGO = ´´) then //Caso nao ache o Local_text... begin RichLog.Lines.Add(´Banco de dados nao encontrado no diretorio padrao.´); Application.CreateForm(TFOpenBox, FOpenBox); FopenBox.Show(); end else RichLog.Lines.Add(´ANTIGO:´+CaminhoBDANTIGO); //Coloca o valor no Label. //Procedure para pegar endereco no registro do Windows. LerRegistro(); end; procedure TFPrincipal.LerRegistro(); //Procedure para ler o Registro do Windows em busca do caminho do Banco de Dados. var Reg: TRegistry; Begin Reg := TRegistry.Create(); with Reg Do Begin rootkey := HKEY_LOCAL_MACHINE; OpenKey(´SOFTWARE\Notoriun\´,FALSE); CaminhoBDNOVO := ReadString(´LocalBancoTeste´); Closekey; End; Migrar(); End; procedure TFPrincipal.GeraLOG(); var ArquivoLOG : TextFile; begin AssignFile(ArquivoLOG, ´C:\Log Notoriun.txt´); Rewrite(ArquivoLOG); WriteLn(ArquivoLOG, RichLOG.Lines.Text); Flush(ArquivoLOG); end; procedure TFPrincipal.Migrar(); var I, J: Integer; TabelasMIGRAR : TStringList; Begin with DataBaseBDANTIGO, ConnectParams do begin DBName := ´localhost:´+CaminhoBDANTIGO; UserName := ´SYSDBA´; ConnectParams.Password := ´masterkey´; SQLDialect := 3; try Open; except on E: Exception do begin MessageDlg(´Impossivel conectar com Banco antigo.´#13 + E.Message, mtError, [mbOk], 0); end; end; end; with DataBaseBDNOVO, ConnectParams do begin DBName := ´localhost:´+CaminhoBDNOVO; ConnectParams.UserName := ´SYSDBA´; Password := ´masterkey´; SQLDialect := 3; try Open; except on E: Exception do begin MessageDlg(´Impossivel conectar com Banco NOVO.´#13 + E.Message, mtError, [mbOk], 0); end; end; DataBaseBDANTIGO.Connected; DataBaseBDNOVO.Connected; TabelasMIGRAR := TStringList.Create; DataBaseBDANTIGO.GetTableNames(TabelasMIGRAR, FALSE); for I := 0 to TabelasMIGRAR.Count - 1 do Begin while (TabelasMIGRAR[I] = ´PACIENTE´) do Begin DataSetBDNOVO.FieldByName(´PAC_CODIGO´).AsInteger := DataSetBDANTIGO.FieldByName(´PAC_CODIGO´).AsInteger; DataSetBDNOVO.Post; DataSetBDNOVO.Next; End; End; End; DataSetBDNOVO.ApplyUpdates; End; procedure TFPrincipal.FormClose(Sender: TObject; var Action: TCloseAction); Begin Application.Terminate(); End; procedure TFPrincipal.FormCreate(Sender: TObject); begin LerIni(CaminhoBDANTIGO); end;
Sergiofigueras
Curtir tópico
+ 0
Responder
Posts
16/11/2007
Douglasaltonia
este erro acontece se o DataSet estiver fechado....
// acho q ta faltando um Edit ou Inset...
while (TabelasMIGRAR[I] = ´PACIENTE´) do
Begin
aki>> DataSetBDNOVO.Edit; ou DataSetBDNOVO.Insert;
DataSetBDNOVO.FieldByName(´PAC_CODIGO´).AsInteger := DataSetBDANTIGO.FieldByName(´PAC_CODIGO´).AsInteger;
DataSetBDNOVO.Post;
DataSetBDNOVO.Next;
End;
espero ter ajudado
t+
// acho q ta faltando um Edit ou Inset...
while (TabelasMIGRAR[I] = ´PACIENTE´) do
Begin
aki>> DataSetBDNOVO.Edit; ou DataSetBDNOVO.Insert;
DataSetBDNOVO.FieldByName(´PAC_CODIGO´).AsInteger := DataSetBDANTIGO.FieldByName(´PAC_CODIGO´).AsInteger;
DataSetBDNOVO.Post;
DataSetBDNOVO.Next;
End;
espero ter ajudado
t+
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)