Alle Verbindungen beenden. C#

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:

  
        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);
            }
        }

Es wäre schön, wenn jemand ne gute Idee hätte und mir helfen könnte!

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,

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 :wink:

Alles in allem schlechtes OOP für NpgsqlConnection … ob “pooling” überhaupt in so eine Klasse gehört wage ich zu bezweifeln

Vielen Dank für die schnellen Antworten!
Da werd ich mich mal mit Connection-Pools beschäftigen :astonished:

Pooling=False im ConnectionString und alle Probleme sind gelöst!

Nochmals vielen Dank für den Tip - damit ist das Wochenende gerettet! :slight_smile:

Ich glaube, das vermerke ich noch mal deutlicher in diesem Stück toten Baum …

Wenn man auf die Vorteile von ConnectionPooling nicht verzichten möchte, könnte man evtl. probieren, ein “NpgsqlConnection.ClearAllPools()” aufzurufen.

NpgsqlConnection.ClearAllPools Method