Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Einfache Änderung eines Felds einer *.DBF DB (https://www.delphipraxis.net/166787-einfache-aenderung-eines-felds-einer-%2A-dbf-db.html)

DataCool 29. Feb 2012 10:03

Datenbank: DBase • Version: ??? • Zugriff über: Bde / Ado

Einfache Änderung eines Felds einer *.DBF DB
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

joachimd 29. Feb 2012 11:13

AW: Einfache Änderung eines Felds einer *.DBF DB
 
Zitat:

Zitat von DataCool (Beitrag 1153622)
Bei der DB handelt es sich um eine *.DBF Datei, zusätzlich existiert noch
eine *.CDX Index Datei.

Welcher Level? Bis dbase III + funzt Advantage (Local Server).
Falls es eine One-Time Geschichte ist: Advantage Data Architect holen und das SQL drüberlassen. Ansonsten die Komponenten (TDataset oder Delphi Components - ja nach Delphi Version) holen und statt der ADO-Geschichten einsetzen.
http://devzone.advantagedatabase.com

DataCool 29. Feb 2012 11:36

AW: Einfache Änderung eines Felds einer *.DBF DB
 
Hi Joachim,

danke für den Tipp, mit dem Data Architekt kann ich die DAten in der DB schonmal ohne Fehler manuell bearbeiten
und ja es ist eine einmalige Sache, drum werd ich jetzt mal schauen, welcher SQL bei mir zum gewünschten Erfolg führt.

Danke nochmal,

Greetz Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz