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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.