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.

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

Sergiofigueras

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+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar