Laden...

Verbindung zur MySQL-Datenbank besteht, Fehler bei MySqlCommand::ExecuteReader()

Erstellt von 1337-Cat vor 4 Jahren Letzter Beitrag vor 4 Jahren 738 Views
1
1337-Cat Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren
Verbindung zur MySQL-Datenbank besteht, Fehler bei MySqlCommand::ExecuteReader()

verwendetes Datenbanksystem: MySQL

Hallo,

ich habe auf einem lokalen Server im Haus eine MySQL-Datenbank.
Mittels meiner App kann ich mich mit der Datenbank verbinden, und erfolgreich Pings ausführen. Sobald ich aber MySqlCommand::ExecuteReader() aufrufe, bekomme ich die folgende Fehlermeldung:> Fehlermeldung:

"Connection must be valid and open."

Hier ist der Code:

MySqlConnectionStringBuilder conBuilder = new MySqlConnectionStringBuilder();
        MySqlConnection dbConn;

        public void buildConn()
        {
            conBuilder.Server = textBox2.Text;
            conBuilder.Port = 3306;
            conBuilder.UserID = "root";
            conBuilder.Password = "xxxx";
            conBuilder.Database = "test";
            conBuilder.ConnectionTimeout = 15;

            String connStr = conBuilder.ToString();
            String queryStr = textBox1.Text;
            MySqlCommand query = new MySqlCommand(queryStr, dbConn);


            dbConn = new MySqlConnection(connStr);
            DataTable table = new DataTable();
            dbConn.OpenAsync();
            MySqlDataReader reader = query.ExecuteReader();
            label1.Text = "";

            while(reader.Read())
            {
                label1.Text += reader["Name"] + "\n";
            }
            dbConn.CloseAsync();
        }

Mit einer Datenbank auf localhost funktioniert das.
Die Datenbank ist auch korrekt konfiguriert, da ich mittels einer Qt-C++ App damit problemlos interagieren kann.

16.806 Beiträge seit 2008
vor 4 Jahren

Du verwendest hier Async auch falsch (klassischer Pitfall); bzw. prinzipiell das ganze Handling von Connections.
Evtl. etwas #Neuland, wenn Du es schon so schön betonst. =)

Trenne die Abfrage der Datenbank vom Connection Handling; anders geht es nicht sauber.
[Artikel] Drei-Schichten-Architektur

      dbConn.OpenAsync();

führt dazu, dass Dein Code schneller ausgeführt wird als die Connection geöffnet wird, weil hier das await fehlt.

Korrekt wäre

await dbConn.OpenAsync();

was sich natürlich dann durch die ganzen Methoden durchziehen muss, damit es korrekt ist.

Verwende daher entweder die synchronen Methoden (nicht empfohlen) oder verwende asycn/await korrekt (empfohlen).

D.h.

  • Connection zusammen bauen
  • Connection asynchron öffnen
  • Datenbank asynchron abfragen
  • Connection asynchron schließen

Von einem manuellen Wait, um asynchrone Methoden zu "wrappen", rate ich generell ab.