Laden...

mit c# auf mysql db zugreifen, fehler bei ExecuteReader()

Erstellt von tasas vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.889 Views
T
tasas Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren
mit c# auf mysql db zugreifen, fehler bei ExecuteReader()

verwendetes Datenbanksystem: mysql

hallo,

dies ist meine erste frage im forum

Ich habe mir letztens einen raspberry pi zugelegt und darauf lasse ich nun eine mysql-Datenbank laufen. Ich habe mir nun ein kleines Programm geschrieben, welches auf die DB zugreifen soll.

Ich kann zwar erfolgreich eine Connection aufbauen (also OpenConnection() liefert true zurück), aber bei "com.ExecuteReader()" erhalte ich einen Timeout:


Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat

An sich ist die Fehlermeldung ja ziemlich klar, ich verstehe aber nicht warum der Verbindungsversuch fehlschlägt, wenn doch "OpenConnection()" erfolgreich war.

Wenn ich bei "SELECT id FROM tabelle01" statt "id" z.B "asdfasdf" eingebe (die Spalte gibt es natürlich nicht) erhalte ich auch eine Fehlermeldung die mir genau das sagt.
Also hab ich ja irgendwie schon eine Verbindung zur DB, wieso kann ich dann aber keine Daten auslesen?

Hier der Code:


using System;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            DBConnect con = new DBConnect();
            con.GetTestData();
            Console.ReadLine();
        }
    }

    class DBConnect
    {
        private MySqlConnection connection;
        private string server;
        private string database;
        private string uid;
        private string password;

        public DBConnect()
        {
            Initialize();
        }

        private void Initialize()
        {
            server = "192.168.100.116";
            database = "mydb";
            uid = "user";
            password = "geheim";
            string connectionString;
            connectionString = "server=" + server + ";port=3306" + ";database=" + database + ";uid=" + uid + ";password=" + password + ";CharSet=utf8;";
            connection = new MySqlConnection(connectionString);
        }

        private bool OpenConnection()
        {
            try
            {
                connection.Open();
                return true;
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }

        private bool CloseConnection()
        {
            try
            {
                connection.Close();
                return true;
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }

        public void GetTestData()
        {
            if(this.OpenConnection() == true)
            {
                string query = "SELECT id FROM tabelle01";
                MySqlCommand com = new MySqlCommand(query, connection);
                try
                {
                    MySqlDataReader reader = com.ExecuteReader();
                    while (reader.Read())
                    {
                        Console.WriteLine("{0} ist ein erhaltener Wert", reader.GetString(1));
                    }
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }  
            }
        }
    }
}

Ich hoffe ihr könnt mir helfen

mfg tasas

16.830 Beiträge seit 2008
vor 5 Jahren

Naja, Du liest die Fehlermeldung nicht genau.

Die Fehlermeldung sagt auch aus, dass der MySQL Server zu lange für die Antwort braucht -> Timeout.
Das legt auch das restliche Verhalten nahe, wenn es bei Syntaxfehler funktioniert aber beim Laden der Inhalte nicht.

Nen Raspberry ist sehr sehr langsam bei Datenbanken. Er ist für IO einfach nicht gedacht.
Da reichen schon wenige Einträge in eine DB, und er braucht gefühlt ewig.

Spiel halt mal mit dem Timeout.

Ansonsten ist der Code auch strukturell sehr sehr verbesserungswürdig; aber denke, dass Du aktuell eh nur am Probieren bist.

T
tasas Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

Danke für deine schnelle Antwort

Ich hab den Timeout jetzt stark erhöht, jedoch hat das meinen Fehler leider nicht behoben.

1
124 Beiträge seit 2012
vor 5 Jahren

Wie viele Datensätze sind denn in deiner Datenbank?

Ist der Tabellenname korrekt geschrieben?

Stört eine Firewall oder ähnliches eventuell?

T
tasas Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

In der Db sind nur sechs Datensätze

Ja, der Tabellenname stimmt, wenn ich einen falschen eingebe erhalte ich auch eine entsprechende Fehlermeldung:

Table 'tabellexyz' doesn't exist

ich denke nicht dass eine Firewall den Datenaustausch blockierte, da
ich wenn ich auf meinem Pi "iptables -L" eingebe folgenden output erhalte:


Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Gibt es sonst noch etwas was die Kommunikation blockieren könnte?

T
tasas Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

Ja ich kann mit der MySql Workbench von meinem Laptop aus auf die Db zugreifen.

Um Remote freizugeben habe ich in der Config-Datei die "bind-adress" auskommentiert, da ich ja über die Workbench auf die Db zugreifen kann, nehme ich an das der Remote-Zugriff funktioniert.