AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Einfache Änderung eines Felds einer *.DBF DB
Thema durchsuchen
Ansicht
Themen-Optionen

Einfache Änderung eines Felds einer *.DBF DB

Ein Thema von DataCool · begonnen am 29. Feb 2012 · letzter Beitrag vom 29. Feb 2012
Antwort Antwort
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, 11: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
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 29. Feb 2012, 12:13
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
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

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

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

  Alt 29. Feb 2012, 12:36
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 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