AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi IBDatabase -> File löschen
Thema durchsuchen
Ansicht
Themen-Optionen

IBDatabase -> File löschen

Ein Thema von stahli · begonnen am 11. Feb 2013 · letzter Beitrag vom 11. Feb 2013
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

IBDatabase -> File löschen

  Alt 11. Feb 2013, 00:27
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX
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;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: IBDatabase -> File löschen

  Alt 11. Feb 2013, 07:36
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.
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#3

AW: IBDatabase -> File löschen

  Alt 11. Feb 2013, 07:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: IBDatabase -> File löschen

  Alt 11. Feb 2013, 19:28
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."
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (11. Feb 2013 um 19:52 Uhr)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: IBDatabase -> File löschen

  Alt 11. Feb 2013, 19:51
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;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: IBDatabase -> File löschen

  Alt 11. Feb 2013, 20:06
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: IBDatabase -> File löschen

  Alt 11. Feb 2013, 20:32
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...


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...
  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 15:00 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