Laden...

[erledigt] "Der Handle wurde nicht initialisiert"

Erstellt von C4RL0 vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.310 Views
C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 10 Jahren
[erledigt] "Der Handle wurde nicht initialisiert"

verwendetes Datenbanksystem: <MS SQL 2008>

Hallo zusammen,

wenn ich das Hauptfenster meiner Anwendung schließe, möchte ich die LogOut-Zeit in eine Datenbank schreiben.

Leider bekomme ich folgende Fehlermeldung, wenn ich das mache: ""Der Handle wurde nicht initialisiert""

Die Suche brachte mich auf den Artikel, wo geraten wird, IDisposable zu verwenden (Dispose implementieren und verwenden (IDisposable))

Leider bekomme ich die Fehlermeldung trotzdem (oder ich bin zu blöd das zu implementieren). Wenn ich Step by Step Debugge, steigt die Anwendung bei "conn.Open();" bereits aus.
Rufe ich die Methode vorher zur Laufzeit auf, funktioniert alles bestens

        ~User()
        {
            SaveLogOut();
        }
        
         public void SaveLogOut()
        {
            string connString = GlobalSettings.GlobalConnectionString;
            using (SqlConnection conn = new SqlConnection(connString))
            {
                try
                {
                    conn.Open();
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Connection = conn;
                        string Tabellenname = "";
                        try
                        {
                               // Hier mein SQL
                               cmd.ExecuteNonQuery();
                        }
                        catch (SqlException exception)
                        {
                            MessageBox.Show(exception.ToString());
                        }
                    }
                    conn.Close();
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.ToString());
                }
            }
        }

Gruß
Carlo

"Palabras que no coinciden con hechos no valen nada."

C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 10 Jahren

Ich hab den Aufrufenden Code der Klasse in der Mainform anders aufgehängt, jetzt tritt der Fehler nicht mehr auf

Fehler tritt auf:

    public partial class FormMain : Form
    {
        public FormMain()
        {
            User user = new User();
            InitializeComponent();
            ...

Fehler tritt nicht auf:

    public partial class FormMain : Form
    {
        User user = new User();
        public FormMain()
        {
            InitializeComponent();
            ...

Der Fehler scheint also behoben, aber warum, verstehe ich nicht so ganz


Gruß
Carlo

"Palabras que no coinciden con hechos no valen nada."

T
156 Beiträge seit 2012
vor 10 Jahren

Hallo C4RLO,

ganz sicher bin ich mir nicht aber das die Ursache ist aber bei der Anlage von User user=new User() innerhalb von FormMain() wird die Variable user nicht global verfügbar sein.
Greifst Du außerhalb darauf zu sollte eine Exception greifen.
Durch die Anlage außerhalb von FormMain() hat die Variable ja einen anderen Gültigkeitsbereich.

Viele Grüße,
telfa

5.657 Beiträge seit 2006
vor 10 Jahren

Hi C4RL0,

der Code, den du im Destructor stehen hast, wird aufgerufen, wenn das Objekt verworfen wird. Das passiert immer, wenn es keine Referenzen mehr auf das Objekt gibt, z.B. wenn dessen Gültigkeitsbereich verlassen wird. Wenn du das Objekt im Konstruktor deklariert, wird es verworfen, sobald der Konstruktur beendet wird. Wenn du es als Feld deklarierst, bleibt es solange bestehen, wie die Form selbst. Es hilft eben nicht nur einfach alles mal ausprobieren, man muß auch verstehen, was man da macht.

Deine Anforderung ist offenbar:

wenn ich das Hauptfenster meiner Anwendung schließe, möchte ich die LogOut-Zeit in eine Datenbank schreiben.

Warum verwendest du dann nicht das dafür vorgesehene Close-Event deines Hauptfensters?

Christian

PS: Die eigentliche Fehlermeldung entsteht dadurch, daß das Connection-Objekt schon vor dem User-Objekt verworfen wurde und daher nicht mehr verfügbar ist, wenn du den User ausloggen willst. Wie das ganze funktioniert, und warum man solche Funktionen niemald im Destructor implementieren sollte, kannst du in den Einträgen zum GarbageCollector bei MSDN nachschlagen.

Weeks of programming can save you hours of planning

C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 10 Jahren

...Es hilft eben nicht nur einfach alles mal ausprobieren, man muß auch verstehen, was man da macht..

Na ja, das ist eben mein Weg das verstehen zu lernen

...Warum verwendest du dann nicht das dafür vorgesehene Close-Event deines Hauptfensters?..

Hab ich jetzt so erledigt und funktioniert so weit. Ich fand das mit dem Destruktor nur so ungemein praktisch 😉

Danke an alle!


Gruß
Carlo

"Palabras que no coinciden con hechos no valen nada."

16.774 Beiträge seit 2008
vor 10 Jahren

Das sind aber mehr oder minder Grundlagen (der allgemeinen Programmierung, nicht nur C#); (auch wenn Du meinst durch ausprobieren, statt durch nachlesen kommst Du weiter (was zu 99,9% ein Irrglaube ist).

Bitte beachte daher [Hinweis] Wie poste ich richtig? 1.1.1

5.657 Beiträge seit 2006
vor 10 Jahren

...Es hilft eben nicht nur einfach alles mal ausprobieren, man muß auch verstehen, was man da macht..
Na ja, das ist eben mein Weg das verstehen zu lernen

Du siehst ja, wie wweit du damit gekommen bist. Anstatt mal 5 Minuten in die Doku zu schauen, läßt du deine Arbeit von anderen Leuten hier im Forum erledigen. Dann zu sagen, "das ist halt mein Weg", finde ich ziemlich unfair. Wer, glaubst du, wird dir beim nächsten Mal helfen, wenn du nicht die geringste Eigeninitiative aufbringen kannst?

Christian

Weeks of programming can save you hours of planning

C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 10 Jahren

...Du siehst ja, wie wweit du damit gekommen bist. Anstatt mal 5 Minuten in die Doku zu schauen...

Glaub mir, ich habe Stunden mit der Doku verbracht, Deine Vorwürfe finde ich ziemlich unfair.


Gruß
Carlo

"Palabras que no coinciden con hechos no valen nada."

5.657 Beiträge seit 2006
vor 10 Jahren

Ich habe deine Aussage so verstanden, daß du lieber rumprobieren willst, als dich mal mit den Grundlagen zu beschäftigen. Und deine Herangehensweise hat das im Grunde ja auch bestätigt. Wenn man einen Destruktur so verwendet, wie du es tust, weil es "ungemein praktisch" ist, dann fehlen die entsprechenden Grundlagen. Da hättest du einfach mal unter dem Stichwort in der Doku geschaut, und wärst deinem Problem auf die Spur gekommen.

Christian

Weeks of programming can save you hours of planning