Announcement

Collapse
No announcement yet.

Einrichten einer Datenbank per Script (.Net)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Einrichten einer Datenbank per Script (.Net)

    Hallo,

    ich erzeuge eine Datenbank mit Hilfe des unten angeführten Programmteils.
    Die Datenbank wird erfolgreich eingerichtet und ich kann mit ihr arbeiten.
    Eine weitere Funktion im Programm erlaubt das Löschen dieser Datenbank.
    Beim Versuch diese Datenbank mit 'drop database' zu löschen bekomme ich aber die Meldung, das die Datenkank in Benutzung ist. Im SQL Server Manager kann ich auch erkennen, dass unmittelbar nach Aublauf des unteren Codes mehrere Verbindungen zur Datenbank bestehen, obwohl ich im Code nur eine Connection anfordere und auch wieder freigebe.

    Wie kann ich erreichen, dass die Verbindungen zur Datenbank nach dem Erzeugen wieder freigegeben werden?



    // Code

    SqlConnection con = this.GetConnectionD4Master();
    SqlConnection cond4daten = null;
    SqlCommand cmd = new SqlCommand(string.Empty, con);
    con.Open();

    #region Schritt 1: Datenbank erzeugen

    StringBuilder sb = new StringBuilder();
    sb.Append("use master;");
    sb.Append(string.Format(" create database {0}", dbBez));
    cmd.CommandText = sb.ToString();
    cmd.ExecuteNonQuery();

    #endregion

    #region Schritt 2: Tabellen, Procse.. anlegen

    cond4daten = this.GetConnectionD4Daten(dbBez);
    cmd.Connection = cond4daten;
    cmd.Connection.Open();
    string help = SqlAnweisung.Replace(string.Format("{0}GO{0}", "--"), "|");
    string[] anweisungen = help.Split('|');
    for (int i = 0; i < anweisungen.Length; i++) {
    cmd.CommandText = anweisungen[i];
    cmd.ExecuteNonQuery();
    }
    cmd.Connection.Close();
    cond4daten = null;

    #endregion

    // End Code

  • #2
    Hallo,

    Ich wuerde sauber 'zusammenraeumen' und folgenden Code anfuegen:

    Code:
    ...
    con4daten.Close();
    con4daten.Dispose();
    cmd.Dispose();
    con.Close();
    con.Dispose();
    Danach duerften eigentlich keine Referenzen / offene Connections mehr vorhanden sein.

    HTH
    *-- robert.oh. --*

    Comment


    • #3
      Hallo,

      Danach duerften eigentlich keine Referenzen / offene Connections mehr vorhanden sein
      Doch - denn ADO.NET (insbesondere im Fall des Providers für den MS SQL Server) verwendet in der Default-Konfiguration einen automatischen Datenbankverbindungs-Pool. Auch wenn SqlConnection die Datenbankverbindung "trennt", bleibt die Datenbank-Session aktiv im Pool zurück.

      Erst dann, wenn das eigene Programm den Pool über den Aufruf System.Data.SqlClient.SqlConnection.ClearAllPools( ) leert, wird die Datenbank-Session zu einem definierbaren Zeitpunkt (d.h. sofort) getrennt.

      Comment


      • #4
        Leider .Net 1.1

        Dank für die Antworten. Leider setzen wir noch .Net1.1 eiin. Dort gibt es kein ClearAllPools(). Gibt es eine Möglichkeit unter .Net1.1 dieses Verhalten nachzubauen?

        Comment


        • #5
          Hallo,

          im Fall von .NET 1.x bleibt nur die Option, den Datenbankverbindungspool für die Anwendung komplett abzuschalten. Dazu muss in der Verbindungszeichenfolge für SqlConnection der Eintrag Pooling=False hinzugefügt werden.

          Comment

          Working...
          X