Autor Beitrag
Dimadon
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 07.01.17 17:45 
Hallo Zusammen,

kurz zu meinem Problem: Mein Code funktioniert bei der ersten Eingabe korrekt. Parameter werden übergeben und auch das SQL Statement funktioniert. Beim zweiten Versuch (exakt gleicher Parameter) läuft der Code durch bis zum Punkt conn.open(). Hier steigt der Code aus. Leider weiß ich nicht warum, da der Debugger zuvor immer die korrekten Werte anzeigt.

Hat eventuell hier jemand eine Idee woran das liegen könnte:

meine Connection sieht wie folgt aus:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
public class Connection
    {

        private static SqlConnection con = null;

        private static String connString = "url";

        public static SqlConnection connection()
        {
           
            if (con == null)
            {
                try
                {
            
                    con = new SqlConnection(connString);

                }
                catch (Exception e)
                {
                    con = null;
                    return null;
                }

            }


            return con;

        }
    }
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4264
Erhaltene Danke: 851


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 07.01.17 17:55 
In deinem gezeigten Code ist nirgendwo ein open. Wenn du meinst das du die von der connection() Methode geliefert Connection nicht zweimal öffnen kannst dann vermutlich deshalb weil du die connection in der Klasse speicherst und ein 2mal öffnen (ohne vorheriges schließen) der gleichen connection vermutlich nicht erlaubt ist. Zumindest macht es keinen Sinn etwas zu öffnen das schon offen ist.

Letztlich ist das aber auch egal ich würde denn Sinn der ganzen Klasse anzweifeln. Es ist in fast 100% aller Fälle keine gute Idee Connections wieder zu verwenden. Das System macht das bereits (Stichwort Connection Pooling). Diesem System noch ein eigens Pooling drüber zu legen macht meist keinen Sinn und das StandardPooling auszuschalten und durch ein eigenes zu ersetzen macht man wenn man sich haargenau auskennt. So genau das man weiß das in seinem speziellen Anwendungsfall man Pooling selber besser implementieren kann als die allgemein Lösung des Systems schon ist. Ich bezweifle das das bei dir der Fall ist.

PS. Das Exception Handling in der Klasse ist so eher überflüssig. Wenn was falsch läuft dann knallt es beim open() nicht im Constructor. Auch der Connectionstring "blub" würde erst beim open knallen.
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 07.01.17 18:07 
Danke für die Hinweise. Es geht es in die Richtung. Habe gerade beim Debuggen gesehen, dass der zweite Durchlauf in der Connection Klasse direkt von der if-Anweisung in den return springt und hierdurch klar keine Verbindung aufgebaut werden kann.

Den conn.open() hatte ich in einer anderen Klasse, wo ich letztendlich auch die SQL-Abfrage mache und auch hier habe ich ein Close drin.

Hättest du einen Tipp wie ich das lösen könnte? Connection Pooling kenne ich bisher nicht werde ich mir aber gleich mal anschauen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4264
Erhaltene Danke: 851


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 07.01.17 18:22 
Zitat:
Connection Pooling kenne ich bisher nicht werde ich mir aber gleich mal anschauen.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
using(var con = new SqlConnection(connString))
{
   con.Open();
}
using(var con2 = new SqlConnection(connString))
{
   con2.Open();
}


Connection Pooling ist bereits da außer du hast es explizit im Connection String abgeschaltet. Für das simple Codebeispiel heißt das con und con2 benutzen die gleiche Connection zur Datenbank auch wenn es 2 verschieden Instanzen der SqlConnection Klasse ist.
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 07.01.17 18:32 
Ok vielen Dank. Nutze ich das Pooling dann direkt in der Methode wo auch das Statement ausgeführt wird oder mache ich das in einer separaten Connection-Klasse so wie ich es bisher hatte?

Greift dann der zweite Durchlauf automatisch auf die zweite Connection zu oder dann doch wieder auf die erste, da die Parameter exakt gleich sind?

Moderiert von user profile iconChristian S.: Beiträge zusammengefasst

Super...vielen Dank :) habe jetzt das Pooling direkt in der Methode verwendet und jetzt läuft es durch. Eine gezieltes close benötige ich hier jedoch nicht mehr, richtig?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4264
Erhaltene Danke: 851


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 07.01.17 18:58 
Wen du es so machst wie in meinem billigen Beispiel, also die Lebenszeit der Connection klasse über die using Klausel zu regeln, nein dann brauchst du kein explizites Close(). Wen du aus dem Scope der using Klausel fällst passiert das automatisch selbst im Fehlerfall.
Das ist allgemein die empfehlenswerte Vorgehensweise. Wenn du irgendwas Richtung Datenbank machst so spät wie möglich die Connection öffnen und so früh wie möglich wieder schließen. Das Benutzen der using Klausel führt einen eigentlich auch automatisch in diese Richtung.

Wenn du für irgendwas eine weitere Connection Klasse möchtest macht es eigentlich nur Sinn die zu benutzen um etwas zu haben das den Connectionstring verwaltet aber weniger die Connection selbst.