Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

Einfache Änderung eines Felds einer *.DBF DB

  Alt 29. Feb 2012, 10:03
Datenbank: DBase • Version: ??? • Zugriff über: Bde / Ado
Hallo Leute,

ein Bekannter bat mich gestern darum, wenn es möglich wäre,
Ihm in einer "DB" in einem Feld absolute Pfade zu korrigieren.
Die Inhalte im Feld Datei sind nämlich immer absolut und zeigen auf :
"C:\MP3\..." und sollen auf "D:\MP3" geändert werden.
Dachte ok kein Ding mach ich mal eben ....
Weit gefehlt, habe gestern Abend einiges ausprobiert und nichts hat
zum Erfolg geführt.

Bei der DB handelt es sich um eine *.DBF Datei, zusätzlich existiert noch
eine *.CDX Index Datei.

Meine Änderungsversuche sahen bisher so aus(über Ado) :
Delphi-Quellcode:
procedure TForm1.btn_1Click(Sender: TObject);
var dbf_folder : string;
    i, iID : Integer;
    sFN : string;
begin
  dbf_folder:='D:\DBDir';
  ADOConnection1.LoginPrompt:=false;
  ADOConnection1.ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;Extended Properties=dBase IV;',[dbf_folder]);
  try
    ADOConnection1.Connected:=True;
    ADODataSet1.Connection := ADOConnection1;
    ADODataSet1.CommandText:='Select * from archiv.dbf'; //make your SQL query using the name of the dbf file
    i := 0;
    ADODataSet1.Open;
    while (not ADODataSet1.eof) and (i < 10) do
    begin
      iID := ADODataSet1.FieldByName('ID').AsInteger;
      sFN := ADODataSet1.FieldByName('Datei').AsString;
      sFN := StringReplace(sFN,'C:\MP3','D:\MP3',[rfIgnoreCase]);
      // andere Variante
      //ChangeMp3FN(iID,sFN); // <<--- UPDATE SQL in seperater Query
      ADODataSet1.Edit;
      ADODataSet1.FieldByName('Datei').AsString := sFN;
      ADODataSet1.Post; // <<-- OLE-Exception: Index nicht gefunden
      ADODataSet1.Next;
      inc(i);
   end;
  except
    on E : Exception do
      ShowMessage(E.Message);
  end;

end;

// UPDATE SQL in seperater Query
function TForm1.ChangeMp3FN(const iID: Integer; const sFN: string): Boolean;
var Qry : TADOQuery;
begin
  Result := False;
  Qry := TADOQuery.Create(nil);
  try
    Qry.Connection := ADOConnection1;
    Qry.SQL.Text := 'UPDATE ARCHIV.DBF SET Datei = :pDatei WHERE ID = :pID';
    Qry.Parameters.ParamByName('pID').Value := iID;
    Qry.Parameters.ParamByName('pDatei').Value := sFN;
    Qry.ExecSQL;
    Result := Qry.RowsAffected > 0;
  finally
    FreeAndNil(qry);
  end;
end;
Zugriff über BDE mit Treiber Standard Typ DBase führt bei folgendem Code zu einer AV,
nach der die komplette BDE in den Seilen hängt ...
Delphi-Quellcode:
procedure TForm1.btn_BdeClick(Sender: TObject);
var
    iID : Integer;
    sFN : string;
begin
  tbl_Bde.First;
  iID := tbl_Bde.FieldByName('ID').AsInteger;
  sFN := tbl_Bde.FieldByName('Datei').AsString;
  sFN := StringReplace(sFN,'C:\MP3','D:\MP3',[rfIgnoreCase]);
  tbl_Bde.Edit;
  tbl_Bde.FieldByName('Datei').AsString := sFN;
  tbl_Bde.Post; // <<-- hier knallt es dann, Programm im Nirvana & BDE auch im Nirvana
end;
Bin für jede Anregung offen, die DB habe ich mal gezippt an den Thread angehängt.

Danke im vorraus,

Greetz Data
Angehängte Dateien
Dateityp: zip DBF-DB.zip (664,5 KB, 8x aufgerufen)
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat