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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke für deine schnelle Antwort
Ich hab den Timeout jetzt stark erhöht, jedoch hat das meinen Fehler leider nicht behoben.
Wie viele Datensätze sind denn in deiner Datenbank?
Ist der Tabellenname korrekt geschrieben?
Stört eine Firewall oder ähnliches eventuell?
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?
Kommst du denn mit einem anderen Tool auf die DB?
Und hast du den MySQL-Server für Remote freigegeben:
How do I open up my MySQL on my Raspberry Pi for Outside / Remote Connections?
Hier noch ein weiterer Link: Connecting c# program with MySQL database on raspberry pi. Unable to connect to any of the specified MySQL hosts
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.