![]() |
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; |
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.
|
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. |
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." |
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; |
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:
Ich stelle das Problem erst mal zurück. Für mein Testprojekt ist es im Moment nicht SOOO schlimm.
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; |
AW: IBDatabase -> File löschen
Zitat:
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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