Benutzer mit den meisten Antworten
Verbindung zu MSSQL wird unbeabsichtigt geschlossen

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
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- Als Antwort vorgeschlagen Guido Franzke Montag, 29. Juli 2019 06:23
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 6. August 2019 06:20
-
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- Als Antwort vorgeschlagen Guido Franzke Montag, 29. Juli 2019 06:23
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 6. August 2019 06:21
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- Als Antwort vorgeschlagen Guido Franzke Montag, 29. Juli 2019 06:23
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 6. August 2019 06:20
-
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
-
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- Als Antwort vorgeschlagen Guido Franzke Montag, 29. Juli 2019 06:23
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 6. August 2019 06:21