![]() |
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:
Zugriff über BDE mit Treiber Standard Typ DBase führt bei folgendem Code zu einer AV,
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; nach der die komplette BDE in den Seilen hängt ...
Delphi-Quellcode:
Bin für jede Anregung offen, die DB habe ich mal gezippt an den Thread angehängt.
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; Danke im vorraus, Greetz Data |
AW: Einfache Änderung eines Felds einer *.DBF DB
Zitat:
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. ![]() |
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 03:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz