Hallo,
ich habe ein Windows-Programm (C#, .NET Ver. 3.5) entwickelt, welches für die verwendete DB eine backup und restore Funktionalität anbieten soll. Das lässt sich ja leider alles nur durch batch-Scripte, welche vom Programm aus gestartet werden, erledigen. Aber was solls!? Backup funktioniert ja auch, nur leider das restore nicht. Problem dabei ist, das das Programm selbst irgendwie eine Verbindung zur DB offen hält und ich vor dem restore nicht die Datenbank und das Schema löschen kann! Es kommt also immer die Fehlermeldung: "database xyz is being accessed by other users".
Was ich dabei nicht verstehe ist, das ich alle von mir benötigten Verbindungen immer beende! So sehen etwas verallgemeinert meine Zugriffe aus:
Es wäre schön, wenn jemand ne gute Idee hätte und mir helfen könnte!Code:public NpgsqlConnection openConnection() { NpgsqlConnection dbConnection = null; try { dbConnection = new NpgsqlConnection(DBConnectionStr); dbConnection.Open(); return dbConnection; } catch (NpgsqlException exc) { throw exc; } } public void closeConnection(NpgsqlConnection dbConnection) { if (dbConnection != null) { if (dbConnection.State == ConnectionState.Open) dbConnection.Close(); dbConnection.Dispose(); } } public void Execute(string query) { NpgsqlConnection dbConn = null; try { // Verbindung zur DB herstellen dbConn = openConnection(); // irgendwas machen NpgsqlCommand cmd = new NpgsqlCommand(query, dbConn); cmd.ExecuteNonQuery(); cmd.Dispose(); } catch (NpgsqlException exc) { throw exc; } finally { closeConnection(dbConn); } }
Gruß
Marc
Da steht "by other users". Kann es sein, dass die DB noch von anderen Verbindungen verwendet wird?
Außerdem verwendet Npgsql per Default einen Connection Pool, der deine Verbindung nicht wieder schließt sondern in den Pool zurückgibt,
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Wenn man möchte kann man den abschalten
NpgsqlConnection Members
man kann dies ueber "Pooled" den connection-string configurieren (warum man dafuer kein gescheites property herangezogen hat erschließt sich mir nicht)
aber ja Default => True
in konsequenz heisst das - wenn NpgsqlConnection einen pool implementiert, macht es wenig Sinn, wenn du (der OP) auch noch mehrere Instanzen von dem ding Erzeugst .. das dürften dann zuviele Pools sein
Alles in allem schlechtes OOP für NpgsqlConnection ... ob "pooling" überhaupt in so eine Klasse gehört wage ich zu bezweifeln
Geändert von symbiont (02.10.2009 um 14:34 Uhr)
Vielen Dank für die schnellen Antworten!
Da werd ich mich mal mit Connection-Pools beschäftigen![]()
Pooling=False im ConnectionString und alle Probleme sind gelöst!
Nochmals vielen Dank für den Tip - damit ist das Wochenende gerettet!![]()
Ich glaube, das vermerke ich noch mal deutlicher in diesem Stück toten Baum ...
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Wenn man auf die Vorteile von ConnectionPooling nicht verzichten möchte, könnte man evtl. probieren, ein "NpgsqlConnection.ClearAllPools()" aufzurufen.
NpgsqlConnection.ClearAllPools Method
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen