Ergebnis 1 bis 7 von 7

Thema: Alle Verbindungen beenden. C#

  1. #1
    MHA
    MHA ist offline Neuer Benutzer
    Registriert seit
    02.10.2009
    Beiträge
    8

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

    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);
                }
            }
    Es wäre schön, wenn jemand ne gute Idee hätte und mir helfen könnte!

    Gruß
    Marc

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    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

  3. #3
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    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

    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)

  4. #4
    MHA
    MHA ist offline Neuer Benutzer
    Registriert seit
    02.10.2009
    Beiträge
    8

    Standard

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

  5. #5
    MHA
    MHA ist offline Neuer Benutzer
    Registriert seit
    02.10.2009
    Beiträge
    8

    Standard

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

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

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    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

  7. #7
    Avatar von progs
    progs ist offline Super-Moderator
    Registriert seit
    26.11.2005
    Ort
    Kulmbach, Bayern, Germany, 108121049209415, Kulmbach
    Beiträge
    185

    Standard

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

    NpgsqlConnection.ClearAllPools Method

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum