Jump to content
Unity Insider Forum

C# - MySQL Datenbank auslesen scheitert


Unifier

Recommended Posts

Hallo Community! :)

 

Folgendes Problem:

 

Ich möchte eine Verbindung zu einem MySQL Server aufbauen und von dort Daten abrufen.

 

Eigentlich keine große Sache, allerdings bin ich jetzt schon seit 2 Wochen dran und es geht einfach nicht, keine Ahnung mehr woran es liegt. :wacko::angry: Ich habe es jetzt in die kleinsten Bestandteile aufgebrochen.

 

Der Fehler der kommt ist:

"MySql.Data.MySqlClient.MySqlException: Reading from the stream has failed. ---> System.IO.EndOfStreamException: Failed to read past end of stream."

 

Nun werdet ihr sagen: Geh zu google und schau was da kommt.

 

Danke, so weit war ich schon. ^_^

 

Ganz gute Einträge finden sich hier:

 

https://bugs.mysql.c...ug.php?id=75917

https://bugs.mysql.c...ug.php?id=76597

und speziell: https://forum.unity3...th-mysql.63364/

 

Mit dem letzten Link bin ich ursprünglich an die Sache ran gegangen und habe dann den Code immer einfacher gestaltet und dann wiederum weitere Beispiele mithinzugenommen.

 

Die Sache ist: Alles was dort beschrieben ist leuchtet ein, und dennoch geht es nicht.

 

Kann auch gut sein, dass der Fehler offensichtlich ist und ich ihn einfach nicht mehr wahrnehme.

 

Der Connection-String stimmt: Ändere ich den Port, den Nutzer oder das Passwort, quittiert der Server das logischerweise mit:

"Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte."

 

Stimmen aber die Daten und ich will nur eine ganz einfache Abfrage zur Version, kommt immer und immer wieder:

"MySql.Data.MySqlClient.MySqlException: Reading from the stream has failed. ---> System.IO.EndOfStreamException: Failed to read past end of stream."

 

Ich hänge mal den Code der Testdatei an.

 

Wäre schön, wenn jemand was beisteuern kann. Ziehe jetzt erstmal geknickt von dannen.

 

Vielen Dank vorab!

 

Mark

 

EDIT: Wenn das Thema hier in dem Unterforum falsch ist, bitte verschieben @ Mods :)

sc_MySQL_Simplest.txt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Willkommen im Forum.

 

Der Code sieht eigentlich ok aus. Ich kann also auch nur rumstochern und hoffen, dass ich etwas erwische, was du noch nicht probiert hast.

 

Erst mal die Frage: wo genau kommt der Fehler? Ich nehme an, dass "testConnectionStatus" funktioniert, aber "testConnectionAndSimpleQuery" nicht und dass der Fehler beim cmd.ExecuteScalar() auftritt.

 

Ich würde als erstes den Querystring verändern. Die im Beispiel benutzten Hochkommas sehen seltsam aus. Außerdem würde ich den Select einfacher gestalten, um weitere Fehlermöglichkeiten auszuschließen.

 

Statt

		query = "SELECT question FROM `questions` WHERE id=40;";

mal

		query = "SELECT * FROM 'questions'";

Andere Hochkommas, abschließender Strichpunkt weg, spezifischer Spaltenname weg. Nur mal so als Test.

Link zu diesem Kommentar
Auf anderen Seiten teilen

warum überhaupt die Hochkommas?

warum nicht einfach:

 

command.CommandText = "SELECT question FROM questions WHERE id=40";

Also so lernt man das bei SQL eigentlich immer. Also mit Apostroph. Ich weiß leider nicht warum man das macht, ich habe auch immer unterschiedlich angewendet. Mal gar nichts und mal Apostroph (heißen sie glaub ich)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe vorhin leider Falsch beschrieben. Hatte erst falsch gedacht wie du das so meintest.

Aber die Regel ist ja so. Geht es um String, dann sollte man Hochkomma machen name like 'Blabla'.

Bei Zahlen ist es egal. Es sei denn, sie sind auch als String gespeichert.

 

Da hast du natürlich recht.

 

Und was Hrungdak geschrieben hat geht nicht. Man kann tables nicht als String behandeln.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja klar sobald es in der where-klausel um einen string geht ist Hochkomma sowieso zwingend...

 

 

Ja dann wird das auch die Exception schmeißen, vermute ich (Er kann dein Query nicht auflösen, da es ihn bei den Hochkommas vor dem Table-Name aufschmeißt):

"MySql.Data.MySqlClient.MySqlException: Reading from the stream has failed. ---> System.IO.EndOfStreamException: Failed to read past end of stream."

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi.

Es ist schon ein wenig her und ich finde den Thread nicht mehr dazu. Es gab mal ein Problem bei der using Direktive aus Unity heraus. Vielleicht mal danach suchen.

 

MySql.Data.MySqlClient Unity

 

using MySql.Data.MySqlClient;

 

//Edit:

Ergänzung:

query = "SELECT question FROM `questions` WHERE id=40;";

mal in

query = "SELECT question FROM `questions` WHERE id=40"; ändern.

 

Er sucht ja quasi nach id 40;(Semikolon) und nicht nach 40. Außer es steht so drin.

 

//Edit2:

Mit Sqlite hatte mein DB-Zugriff gut funktioniert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man kann auch mal so versuchen

 

query = @"SELECT question FROM `questions` WHERE id=40;";

 

aber das geht ja nicht mit 'questions' ...?

wenn ich das in meiner db im ssms versuche:

select * from 'myTable'

 

Folgendes Error Message:

Msg 102, Level 15, State 1, Line 4

Incorrect syntax near 'myTable'.

 

Wohin select * from myTable, Ergebnisse bringt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber das geht ja nicht mit 'questions' ...?

wenn ich das in meiner db im ssms versuche:

select * from 'myTable'

 

Folgendes Error Message:

Msg 102, Level 15, State 1, Line 4

Incorrect syntax near 'myTable'.

 

Wohin select * from myTable, Ergebnisse bringt.

Du nimmst hochkomma. Was du bei mir siehst ist ein Schräges wie zum Beispiel bei ò.

 

EDIT: Ich kannst bestätigen: ich habe folgendes versucht:

string query = "SELECT * FROM `user` WHERE `username` LIKE 'lovetown' ORDER BY `id` ASC";
string query = "SELECT * FROM user WHERE username LIKE 'lovetown' ORDER BY id ASC";

Und auch am ende mit Semikolon (";") und auch ohne. Alle haben bei mir ohne Fehlermeldung funktionert. (Hat das lange gedauert bis ich MySQL in Unity hinbekommen haben :blink:

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Mazy:

query = @"SELECT question FROM `questions` WHERE id=40;";

 

Siehst du das rote Semikolon? Das ist zuviel.

Doch, hab ich gesehen, klar. Aber das funktioniert bei mir trotzdem in Unity. Wie gesagt im letzten Post: Ich habe alle Möglichkeiten (die auch so kenne) ausprobiert. Mit und ohne Semikolon. Kein Fehler. Alle haben die Resultaten ausgegeben. SQL hat ja selbst auch ein Semikolon im Syntax stehen. Allerdings ist das optional. Daher sollte eigentlich kein Error geben. Zu mindest nicht in MySQL. Bei anderen wie sqlite weiß ich nicht.

 

@Mazy:

bei mir funktioniert es weder mit ` noch mit ' im ssms.

Und das Semikolon gehört da auch nicht hin. Aber was sollte es wirklich bringen einen Tabellennamen mit `oder ' zu schreiben?

 

Ja gut zu ms Version kann ich nichts sagen. Es ging ja hierbei um MySQL. Semikolon muss nicht sein, kann man aber machen.

Wie gesagt. Man kann ` das weglassen. Und warum man das machen kann weiß ich nicht.

 

 

 

Ein Beispiel wie das bei mir in Unity aussieht:

TtVHsKC.png

 

Resultat (das mit Semikolon hinten dran):

vxRgcDo.png

Die ID des lovetown users ist 1. Also funktioniert.

 

 

Den gleichen Query (ohne Anführungsstriche) Wie ich es ebenfalls in PhpMyAdmin (bzw in Php) aufrufe:

s0tEZtZ.png

Funktioniert auch.

 

Müsste mal diesen SQL Server installieren wie das da so ist.

 

Die Version die ich verwende ist MySQL. (Auf meinem Dedicated Server ist es mariaDB).

 

EDIT: hab auch mal mit zahlen versucht:

string query = "SELECT * FROM `user` WHERE `id` = 1;";

Geht auch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man kann ` das weglassen. Und warum man das machen kann weiß ich nicht.

 

Diese Backticks sind dazu da, um Spalten- und Tabellennamen verwenden zu können, die reservierte Wörter sind.

Beispiel:

Jemand (der nicht genannt werden möchte) nennt seine Tabelle SELECT und eine Spalte darin INSERT. Die Namen selbst sind gültig. In einer Query gibt es aber Probleme, weil der Interpreter nicht zwischen Namen und Befehlen aufschlüsseln kann. Dafür verwendet man Backticks.

"CREATE TABLE `SELECT` (`INSERT` int, `id` int);"; // funktioniert!

.....

"SELECT `INSERT` FROM `SELECT` WHERE `id`=40;"; // funktioniert!

 

Warum auch id in Backticks steht? Vielleicht ist id ja schon morgen ein reserviertes Wort, dann funktioniert der Code noch immer.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Diese Backticks sind dazu da, um Spalten- und Tabellennamen verwenden zu können, die reservierte Wörter sind.

Beispiel:

Jemand (der nicht genannt werden möchte) nennt seine Tabelle SELECT und eine Spalte darin INSERT. Die Namen selbst sind gültig. In einer Query gibt es aber Probleme, weil der Interpreter nicht zwischen Namen und Befehlen aufschlüsseln kann. Dafür verwendet man Backticks.

"CREATE TABLE `SELECT` (`INSERT` int, `id` int);"; // funktioniert!

.....

"SELECT `INSERT` FROM `SELECT` WHERE `id`=40;"; // funktioniert!

 

Warum auch id in Backticks steht? Vielleicht ist id ja schon morgen ein reserviertes Wort, dann funktioniert der Code noch immer.

Yoooooooo. Hast recht. Mir ist das gar nicht eingefallen. Hatte nämlich so ein Problem schon mal. Aber laut TobLine geht das bei ihn nicht mit ssms.

 

Backticks so heißen sie also.

Ok vl ist da wirklich ein Unterschied zwischen SQL Server und MySQL.

Bei SQL Server scheint es mit beiden Hochkommas nicht zu funktionieren. Hab bei mir SQL Server Management Studio installiert und da probiert.

Ja also ich war neugierig und wollte auch mit sqlite probieren. Da wird bereits beim DB Viewer auch mit den schrägen Hochkommata (bzw Backticks) gezeigt, als ich den Datenbank erstellen wollte.

 

Und yop das geht auch (mit Semikolon):

string query = "SELECT * FROM `user` WHERE `uid` = 1;";

 

Schön, dass ich nebenbei sqlite in unity gelernt habe ^^. Hab damit schon öfters gearbeitet aber in lua.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Suuuper weird - ich habe am Code nichts geändert, plötzlich gehts. Extrem merkwürdig.

 

 

In dem Sinne kann ich nur sagen Danke für Eure Mühe und:

 

 

Und auch am ende mit Semikolon (";") und auch ohne. Alle haben bei mir ohne Fehlermeldung funktionert. (Hat das lange gedauert bis ich MySQL in Unity hinbekommen haben :blink:

 

 

Das kann ich bestätigen, habe ich auf deinen Post hin probiert, es geht mit ' als auch mit ` sowie am Ende mit und ohne Semikolon.

 

 

Diese Backticks sind dazu da, um Spalten- und Tabellennamen verwenden zu können, die reservierte Wörter sind.

Beispiel:

Jemand (der nicht genannt werden möchte) nennt seine Tabelle SELECT und eine Spalte darin INSERT. Die Namen selbst sind gültig. In einer Query gibt es aber Probleme, weil der Interpreter nicht zwischen Namen und Befehlen aufschlüsseln kann. Dafür verwendet man Backticks.

"CREATE TABLE `SELECT` (`INSERT` int, `id` int);"; // funktioniert!

.....

"SELECT `INSERT` FROM `SELECT` WHERE `id`=40;"; // funktioniert!

 

Warum auch id in Backticks steht? Vielleicht ist id ja schon morgen ein reserviertes Wort, dann funktioniert der Code noch immer.

 

Interessant!

 

Nochmal Danke an alle für die Unterstützung :)

 

Grüße

Mark

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...