Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi IBDatabase -> File löschen (https://www.delphipraxis.net/173170-ibdatabase-file-loeschen.html)

stahli 10. Feb 2013 23:27

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX

IBDatabase -> File löschen
 
Ich teste gerade ein paar Sachen mit IBX (soll keine Dauerlösung sein, also auf AnyDAC müsst Ihr nicht verweisen).

Wenn ich eine Datenbank erzeuge oder öffne funktioniert alles.
Will ich eine neue Datei erzeugen, wird die alte nicht gelöscht.
DeleteFile wird also nicht ausgeführt, da noch eine Verbindung vom Programm offen ist.
Weiß jemand Hilfe...?

Delphi-Quellcode:
procedure TDataModuleMyFriends.CloseDataBase;
begin
  if IBTransactionMyFriends.InTransaction then
    IBTransactionMyFriends.Commit;
  IBDatabaseMyFriends.Connected := False;
  IBDatabaseMyFriends.DatabaseName := '';
end;

procedure TDataModuleMyFriends.CreateDataBase;
var
  DT: TDateTime;
begin
  CloseDataBase;
  DeleteFile(FileName);
  DT := Now;
  while (ExistDataBase) and (DT + (15 * OneSecond) > Now) do // nicht erfolgreich !!!
    Sleep(500);
  IBDatabaseMyFriends.DatabaseName := FileName;
  IBScriptMyFriends.ExecuteScript;
end;

procedure TDataModuleMyFriends.DataModuleCreate(Sender: TObject);
begin
  FileName := ExtractFilePath(ParamStr(0)) + 'MyFriends.fdb';
  IBScriptMyFriends.Script.Text := StringReplace(IBScriptMyFriends.Script.Text, '[FILENAME]', FileName, [rfReplaceAll]);
  TssGuiManager.ObjectClassList.AddObject('TFriend', IBQueryFriends);
  TssGuiManager.RefreshAllData();
end;

procedure TDataModuleMyFriends.DataModuleDestroy(Sender: TObject);
begin
  CloseDataBase;
end;

function TDataModuleMyFriends.ExistDataBase: Boolean;
begin
  Result := FileExists(FileName);
end;

procedure TDataModuleMyFriends.OpenDataBase;
begin
  CloseDataBase;
  if not ExistDataBase then
    CreateDataBase;
  IBDatabaseMyFriends.DatabaseName := FileName;
  IBDatabaseMyFriends.LoginPrompt := False;
  IBDatabaseMyFriends.Params.Clear;
  IBDatabaseMyFriends.Params.Add('user_name=SYSDBA');
  IBDatabaseMyFriends.Params.Add('password=masterkey');
  IBDatabaseMyFriends.Open;
  IBTransactionMyFriends.StartTransaction;
  IBQueryFriends.Open;
  IBQueryFriends.FetchAll;
end;

Furtbichler 11. Feb 2013 06:36

AW: IBDatabase -> File löschen
 
Ich würde den Rückgabewert von DeleteFile auswerten und ggf. öfter probieren. Wer weiss, vielleicht hält FB doch noch für ein paar ms den Finger auf die Datei.

tsteinmaurer 11. Feb 2013 06:51

AW: IBDatabase -> File löschen
 
Setz einen Breakpoint auf DeleteFile, geh dann in die Monitoring-Tabelle MON$ATTACHMENTS rein und schau, ob es noch aktive Verbindungen gibt. Vielleicht hast ja die Datenbank noch mit einem anderen Tool offen?

Sollte es nicht auf TIBDatabase Ebene auch eine Methode zum Droppen einer Datenbank geben. Ist vielleicht besser, so dem Firebird Server mitzuteilen, dass man eine DB entfernen möchte, als das auf Dateisystemebene zu machen.

stahli 11. Feb 2013 18:28

AW: IBDatabase -> File löschen
 
Der Rückgabewert ist einfach false.
Es bringt auch nichts, das Löschen 30 Sek. zu wiederholen.
Auch aus dem Exporer heraus kann ich das File nicht löschen.

Allerdings habe ich festgestellt, dass das Problem nur besteht, wenn ich die Datenbank während der "Sitzung" (aktuelle Projektinstanz) per Script erstellt habe.
Wenn ich eine bestehende Datenbank in meiner "Sitzung" geöffnet habe dann kann ich sie löschen.

Einen sonstigen Zugriff auf die Datenbank habe ich nicht. Das Problem bestand heute auch auf einem XP-Rechner mit embedded Firebird.
Sobald mein Projekt beendet wird kann ich die Datei auch im Explorer löschen.

Ich habe keine Idee, wie ich das abstellen kann.


EDIT: Hmm, wenn ich eine bestehende Datenbank öffne bekomme ich bei Änderungen die Meldung: "Aktualisierung nicht erfolgreich."

Lemmy 11. Feb 2013 18:51

AW: IBDatabase -> File löschen
 
Hallo,


kannst Du bitte mal schauen, IBDatabase besitzt eine Methonde "CreateDatabase" - d.h. versuch mal das hier:

Delphi-Quellcode:
procedure TDataModuleMyFriends.OpenDataBase;
begin
  CloseDataBase;

  IBDatabaseMyFriends.DatabaseName := FileName;
  IBDatabaseMyFriends.LoginPrompt := False;
  IBDatabaseMyFriends.Params.Clear;
  IBDatabaseMyFriends.Params.Add('user_name=SYSDBA');
  IBDatabaseMyFriends.Params.Add('password=masterkey');

  if not ExistDataBase then
    IBDatabaseMyFriends.CreateDatabase;

  IBDatabaseMyFriends.Open;
  IBTransactionMyFriends.StartTransaction;
  IBQueryFriends.Open;
  IBQueryFriends.FetchAll;
end;

stahli 11. Feb 2013 19:06

AW: IBDatabase -> File löschen
 
Dann bekomme ich den Fehler, dass Paßwort und User nicht zugewiesen ist (obwohl die Daten in Params stehen).

CreateDatabase führt m.E. auch nur ein Script aus, was ich etwas komplexer realisiere.
Delphi-Quellcode:
procedure TIBDatabase.CreateDatabase;
var
  tr_handle: TISC_TR_HANDLE;
begin
  CheckInactive;
  tr_handle := nil;
  if (ServerType = '') then
    ServerType := 'IBServer'; {do not localize}
  Call(
    FGDSLibrary.isc_dsql_execute_immediate(StatusVector, @FHandle, @tr_handle, 0,
                               PAnsiChar(AnsiString('CREATE DATABASE ''' + FDBName + ''' ' + {do not localize}
                               Params.Text)), SQLDialect, nil), True);
  FDBSQLDialect := GetDBSQLDialect;
end;
Ich stelle das Problem erst mal zurück. Für mein Testprojekt ist es im Moment nicht SOOO schlimm.

Lemmy 11. Feb 2013 19:32

AW: IBDatabase -> File löschen
 
Zitat:

Zitat von stahli (Beitrag 1202957)
Dann bekomme ich den Fehler, dass Paßwort und User nicht zugewiesen ist (obwohl die Daten in Params stehen).


hm.. ich bekomme den Fehler dass er den Parameter "user_name" nicht kennt... wenn ich den komplett weg lasse (also kein User_name, kein Password), dann legt er die Datenbank an... das ist aber sehr seltsam...


Zitat:

Zitat von stahli (Beitrag 1202957)
CreateDatabase führt m.E. auch nur ein Script aus, was ich etwas komplexer realisiere.

da hast Du sicherlich recht - entscheidend an der Sache ist aber, dass das Script noch weiterhin Zugriff auf die DB hat und du diese deshalb nicht löschen kannst...


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 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