C# Chat Programm (Text an MySQL Datenbank übergeben)

matias schrieb:
@Krabbelfiechle
ja,in dem du folgendes machst

Code:
while
{
  Aufruf();
  Thread.Sleep(TimeSpan.FromSeconds(5));
}

und bitte noch folgendes machen
Code:
empfaenger.Replace("'", "´");
bezüglich SQL Injection.
oder gleich richtig wie in meinem Letzten Post vorgeschlagen :)

Bin etwas verwirrt hab deinen Vorschlag eingefügt dennoch aktualisiert er den Text nicht :/
 
Hast du denn in der While-Schleife den Aufruf mit deinem Benutzer aufgerufen? Denn der Benutzer ist ja zwingend notwendig in deiner Methode.
 
Habe ich gemacht. Habe allerdings jetzt nochmal etwas umgeändert damit er nicht den kompletten Text immer wieder neu laden muss.
Die Variable empfaenger ist bei mir Public in diese speichere ich ja den Benutzer ein :
Code:
        public string empfaenger;

        public void Aktualisierung()
        {
            MySqlConnection connection = new MySqlConnection(myConnectionString);
            MySqlCommand kommando = connection.CreateCommand();
            kommando.CommandText = "SELECT Text, Zeitpunkt, gelesen FROM techchat.nachrichten WHERE Empfaenger = '" + empfaenger + "' and gelesen = 0";
            MySqlDataReader leser;
            connection.Open();
            leser = kommando.ExecuteReader();

            string Text;
            string Zeitpunkt;
            string Ausgabe2 = "";

            while (leser.Read())
            {
                Text = leser.GetValue(0).ToString();
                Zeitpunkt = leser.GetValue(1).ToString();
                Ausgabe2 = Ausgabe2 + "< " + Zeitpunkt + " >   " + Text + Environment.NewLine;
            }

            textBox2.Text = textBox2.Text + Ausgabe2;

            kommando.CommandText = "UPDATE techchat.nachrichten SET gelesen = 1 WHERE gelesen = 0 and Empfaenger ='" + empfaenger + "'";
            kommando.BeginExecuteNonQuery();
        }
        public void Time()
        {
            while(1==1)
            {
                this.Aktualisierung();
                Thread.Sleep(TimeSpan.FromSeconds(5));
            }
        }
 
Ohje.
Ich ahne das Problem ^^
1.Wo rufst du Time() auf?
2.Das Problem ist,dass du ja mittels Buttonklick ein Eintrag machst. Dabei soll aber im Hintergrund alle 5 sek geprüft werden ob ein neuer Eintrag gekommen ist. Hierfür brauchst du BackgroundWorker die dein Gui dann alle 5 sek aktualisieren oder mit Events.
Das ist etwas komplexer das Thema.

Chat Programm

Event Chat
 
Zuletzt bearbeitet:
So sehe ich kein Fehler.

Setze Debug Breakpoints und schau dir an was passiert, wenn du die Funktion Aktualisierung() aufrufst.
Sollte schnell dein Problem beheben.

Tipp am Rand: Nutze immer englische Bezeichnungen, vor allem in der Datenbank.
Ist ersten sauberer und so kommt jeder damit klar.

Edit: @matias hat natürlich recht. Die GUI ist geblockt, solange bis das While um ist, also für immer.

http://coders-corner.net/2013/01/20...ead-vs-background-thread-vs-backgroundworker/
 
Zuletzt bearbeitet:
Zudem musst du noch connection.Close() aufrufen nach dem Update!
Sonst klappt das nicht.
 
Gibt es keine andere Möglichkeit? Das Programm sollte ziemlich Stupide :freak: gehalten werden.
Weil ich nicht zu viel Zeit in das Projekt stecken möchte.:rolleyes:
 
Leider nicht.Außer du wartest bis du eine Nachricht erhalten hast, und gehst dann raus aus der while - Schleife
 
hmmmmmmm!
Ist das andere so komplex ? bzw. könntest du mir das erläutern ^^?
 
Krabbelfiechle schrieb:
hmmmmmmm!
Ist das andere so komplex ? bzw. könntest du mir das erläutern ^^?

Du sollst doch aus dem Zeug lernen und alles was du grade machst, bringt dich später weiter. Schau dir den Link in meinem Post oben an, dort wird simple erklärt wie das mit dem BackgroundWorker geht. Ist in 5 Minuten geändert.
 
Und nicht vergessen

connection.Close() und Time() aufrufen,irgendwo in deinem Code. wird dann laufen aber die GUI ist dann geblockt.
 
Code:
        public string Aktualisierung()
        {
            this.ichErmitteln();
            MySqlConnection connection = new MySqlConnection(myConnectionString);
            MySqlCommand kommando = connection.CreateCommand();
            kommando.CommandText = "SELECT Text, Zeitpunkt, gelesen FROM techchat.nachrichten WHERE (Empfaenger = '" + empfaenger + "'  OR Sender = '" + Ich + "') OR (Sender = '" + empfaenger + "' AND Empfaenger  = '" + Ich + "') and gelesen = 1";
            MySqlDataReader leser;
            connection.Open();
            leser = kommando.ExecuteReader();

            string Text;
            string Zeitpunkt;
            string Ausgabe2 = "";

            while (leser.Read())
            {
                Text = leser.GetValue(0).ToString();
                Zeitpunkt = leser.GetValue(1).ToString();
                Ausgabe2 = Ausgabe2 + "< " + Zeitpunkt + " >   " + Text + Environment.NewLine;
            }

            return Ausgabe2;

            kommando.CommandText = "UPDATE techchat.nachrichten SET gelesen = 1 WHERE gelesen = 0 and Empfaenger ='" + empfaenger + "'";
            kommando.BeginExecuteNonQuery();
            connection.Close();
        }
        
        public void Time()
        {
           
                
                EasyTimer.SetInterval(() =>
                {
                    textBox2.Text = textBox2.Text + this.Aktualisierung();
                }, 10000);
            
        }

bei dem Teil :

Code:
                    textBox2.Text = textBox2.Text + this.Aktualisierung();

bekomme ich diesen Fehler :
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement textBox2 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

Jemand ne Idee wie ich das umgehen bzw berichtigen kann :)?
 
Du kannst keine Steuerelemente aus einem anderen Thread heraus aktualisieren.

Du musst diese Invoken. Windows Forms ist mir nicht so ganz geläufig, sollte aber nicht all zu sehr von WPF abweichen.

Probier´s mal hiermit :

Code:
textBox2.Invoke((MethodInvoker) (() => textBox2.Text = this.Aktualisierung()));


PS : http://www.codeproject.com/ Diese Seite hilft mir während meiner Ausbildung oft weiter :)


Gruß SomeDifferent
 
SomeDifferent schrieb:
Du kannst keine Steuerelemente aus einem anderen Thread heraus aktualisieren.

Du musst diese Invoken. Windows Forms ist mir nicht so ganz geläufig, sollte aber nicht all zu sehr von WPF abweichen.

Probier´s mal hiermit :

Code:
textBox2.Invoke((MethodInvoker) (() => textBox2.Text = this.Aktualisierung()));


PS : http://www.codeproject.com/ Diese Seite hilft mir während meiner Ausbildung oft weiter :)


Gruß SomeDifferent


Danke dir :) Hat mir sehr weitergeholfen habe gerade das ganze Internet durchwühlt nach genau diesem :)!
Funktioniert einwandfrei! Die Seite werde ich mir noch anschauen :)
Ergänzung ()

Hallo nochmals,

muss mich nochmal an euch wenden da ich gerade daran scheitere :

Ich habe meinen Benutzerliste offen und öffne einen Chat mit einem benutzer. Ich kann mehrere Chats gleichzeitig offen haben.
Wenn ich nun einen dieser Chats schließe läuft der EasyTimer weiter und dann stürtzt das Programm ab mit dieser Meldung :

Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.

Bei diesem Code :

Code:
textBox2.Invoke((MethodInvoker)(() => textBox2.Text = this.Aktualisierung()));

Wie kann ich Prüfen ob die Instanz von Form1 noch geöffnet ist ? sodass er den EasyTimer für diese Beendet aber bei den anderen Chats weiterlaufen lässt.

Diesen Code steuere ich in einer Funktion an :
Code:
        public string Aktualisierung()
        {



            this.ichErmitteln();
            MySqlConnection connection = new MySqlConnection(myConnectionString);
            MySqlCommand kommando = connection.CreateCommand();
            kommando.CommandText = "SELECT Text, Zeitpunkt, gelesen FROM techchat.nachrichten WHERE (Empfaenger = '" +
            empfaenger + "'  AND Sender = '" + Ich + "') OR (Sender = '" + empfaenger + "' AND Empfaenger  = '" + Ich + "')  
            and gelesen = 1";
            MySqlDataReader leser;
            connection.Open();
            leser = kommando.ExecuteReader();

            string Text;
            string Zeitpunkt;
            string Ausgabe2 = "";

            while (leser.Read())
            {
                Text = leser.GetValue(0).ToString();
                Zeitpunkt = leser.GetValue(1).ToString();
                Ausgabe2 = Ausgabe2 + "< " + Zeitpunkt + " - "+ Ich + " >  " + Text + Environment.NewLine;
            }
            kommando.CommandText = "UPDATE techchat.nachrichten SET gelesen = 1 WHERE gelesen = 0 and Empfaenger ='"
            + empfaenger + "'";
            kommando.BeginExecuteNonQuery();
            connection.Close();
            return Ausgabe2;
            
        }
                
        public void Time()
        {
            
            EasyTimer.SetInterval(() =>
            {
                textBox2.Invoke((MethodInvoker)(() => textBox2.Text = this.Aktualisierung()));
            }, 3000);            
        }

Mfg
Krabbelfiechle;)
 
Ich würde das FormClosed-Event abonnieren und den passenden Timer mit EasyTimer.stop() o.ä. anhalten :)

Gruß
 
Zurück
Oben