none
Verbindung zu MSSQL wird unbeabsichtigt geschlossen RRS feed

  • Frage

  • Hallo Leute, folgender Code wirft in der Insert-Metohde den Fehler:

    ExecuteNonQuery erfordert eine geöffnete und verfügbare Connection. Der aktuelle Status der Verbindung ist 'Geschlossen'

    aus. Warum gibt die Methode Connect() eine geschlossene Verbindung zurück. Ich habe sie explizit geöffnet, geschlossen soll sie eigentlich erst später werden...

    using System;
    using System.Data.SqlClient;
    
    namespace MSSQL {
        class Program {
            private static SqlConnection connection;
            #region Main
            internal static void Main() {
                Program.Connect();
                string query = @"INSERT INTO dbo.DVD(titel,bewertung,genre,jahr,fsk,schauspieler,sprachen) VALUES ('DVD1','2','Drama','1998','12','Harison Ford','deutsch')";
                Program.InsertSingleRecord(query);
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Der Record wurde eingefügt");
                Console.WriteLine("Zum Kappen der Verbindung bitte beliebige Taste drücken...");
                Console.ReadKey();
                Console.ForegroundColor = ConsoleColor.Yellow;
                Program.connection.Close();
                Console.WriteLine("Verbindung wurde wieder geschlossen");
                Console.ForegroundColor = ConsoleColor.White;
            }
            #endregion
    
            #region Verbindung aufbauen
            private static SqlConnection Connect() {
                /*  verbindungslose Klassen(in System.Data)
                   DataSet ds;
                   DataTable db;
               //KLassen mit DB-Verbindungen(in System.Data.Client)
                   SqlConnection conn;
                   SqlDataReader dr;
                   SqlDataAdapter da; 
               */
                //Verbindungsstring über das Windows-Konto
                const string server = "localhost";
                const string instanz = @"\SQLEXPRESS";
                const string database = "MediaDB";
                const string security = "Integrated Security=SSPI";
                const string connString = @"Server=" + server + instanz + ";Database=" + database + ";" + security;
    
                /*  Verbindungsstring über die Authentifizierung
                    const string connStringAuth = @"Server=" + server + instanz + ";Database=" + database + ";User ID=MeinUser;Password=MeinPasswort"; */
    
                //Verbindung herstellen
                using (Program.connection = new SqlConnection(connString)) {
                    try {
                        Console.ForegroundColor = ConsoleColor.White;
                        Console.WriteLine("Verbindung zu einer MSSQL Datenbank wird hergestellt...");
                        Program.connection.Open();
                        Console.ForegroundColor = ConsoleColor.Magenta;
                        Console.WriteLine("Verbindungsdaten-->Instanz:" + instanz + Environment.NewLine + "Verbindungsdaten-->Server:" + server + Environment.NewLine + "Verbindungsdaten-->Datenbank:" + database + Environment.NewLine + "Verbindungsdaten-->Sicherheit:" + security);
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("Verbindung zur Datenbank " + database + " wurde hergestellt");
                    }
                    catch (SqlException ex) {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("Verbindung gescheitert");
                        Console.WriteLine(ex.Message);
                    }
                    return Program.connection;
                }
            }
            #endregion
    
            #region Record einfügen
            private static void InsertSingleRecord(string query) {
                Console.WriteLine("Daten einfügen...");
                try {
                    using (SqlCommand cmd = new SqlCommand(query,Program.connection)) {
                        cmd.ExecuteNonQuery();
                    }
                }
                catch (Exception ex) {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(ex.Message);
                    Console.ReadKey();
                    Environment.Exit(-1);
                }
    
            }
            #endregion
        }
    }
    






    • Bearbeitet tklustig Samstag, 27. Juli 2019 11:54
    Samstag, 27. Juli 2019 11:42

Antworten

  • Hi,

    abgesehen davon, dass man bei statischen Objekten höllisch aufpassen muss, dass sich da nichts in die Quere kommt und man das daher in den meisten Fällen vermeiden sollte (bei Multiuserumgebungen wie ASP.NET oder auch async, ... führt das zu 99% unweigerlich zu vielerlei Problemen, daher dort überhaupt nicht verwenden!) hast Du einen Logikfehler in deiner Anwendung.

    using (Program.connection = new SqlConnection(connString)) {

    führt dazu, dass die Verbindung beim rausgehen aus dem using Block wieder geschlossen und terminiert wird.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 27. Juli 2019 12:09
    Moderator
  • Hi,

    klar. Lass den using Block weg.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 27. Juli 2019 12:40
    Moderator

Alle Antworten

  • Hi,

    abgesehen davon, dass man bei statischen Objekten höllisch aufpassen muss, dass sich da nichts in die Quere kommt und man das daher in den meisten Fällen vermeiden sollte (bei Multiuserumgebungen wie ASP.NET oder auch async, ... führt das zu 99% unweigerlich zu vielerlei Problemen, daher dort überhaupt nicht verwenden!) hast Du einen Logikfehler in deiner Anwendung.

    using (Program.connection = new SqlConnection(connString)) {

    führt dazu, dass die Verbindung beim rausgehen aus dem using Block wieder geschlossen und terminiert wird.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 27. Juli 2019 12:09
    Moderator
  • Aber ich kann doch nicht alle Datenbankoperationen in den using Block reinschreiben. Es muss doch möglich sein, eine dauerhaft offene Verbindung zu initialisieren, die erst dann geschlossen wird, wenn ich es explizit codiere??
    • Bearbeitet tklustig Samstag, 27. Juli 2019 12:31
    Samstag, 27. Juli 2019 12:30
  • Hi,

    klar. Lass den using Block weg.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 27. Juli 2019 12:40
    Moderator