Hallo, habe ein kleines Problemchen mit MySQL. Und zwar scheitert es komischerweise schon ganz am Anfang beim Connection-String. LOL Ich wollte mir eine Klasse schreiben, die diverse grundlegende SQL-Funktionen beinhalten. Unter anderem soll es eine Funktion geben, die einen Connection-String aus einzelnen Werten zusammenstellt, siehe Code-Schnipsel-Bild im Anhang. Das funktioniert auch schon halbwegs. Komischerweise aber nur, wenn ich die Angabe einer Datenbank in den einzelnen Werten weg lasse. Es ist egal, ob dabei ein Passwort verwendet wird oder nicht. Irgendwie schmeißt der den Benutzernamen raus, sobald eine DB mit angegeben ist, und dann kann er nicht mehr verbinden. Siehe Bild: > Access denied for user '<leer>'@'localhost' Ich habe aber wirklich keine Ahnung warum er das tut. Wahrscheinlich schläft der User noch- (egal welchen Name ich verwende), es ist ja erst 04:24 Uhr, vielleicht einfach warten ??? Haben die wohl noch keinen bock auf Authentifizierungen so früh am Morgen? Evtl. kann mir jemand auf die Sprünge helfen. Der Rest läuft ja schon irgendwie ;-) Das muss doch machbar sein, alles übergeben zu können. Ich bin mir Sicher dass die Login-Daten stimmen, da Copy&Paste. Ich benutze den MySQL-Connector v6.5.5 für´s .NET-Framework... http://dev.mysql.com/downloads/connector/net/6.5.html bzw. http://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-6.5.5.msi/from/http://cdn.mysql.com/ ...und habe mich an diesen Connection-String gehalten: http://www.connectionstrings.com/mysql#mysql-connector-net-mysqlconnection Falls es wichtig ist: OS: XP SP3, MySQL: 5.5.16 unter XAMPP Danke schon mal für´s Grübeln...
Habe einen kleinen "Fehler" gefunden, was aber dann irgendwie doch kein Fehler war: Die Connection-Strings sind auf diversen Seiten unterschiedlich beschrieben. Aber egal was ich versuche: Es will nicht. Anstelle von "user id" oder "password" kann man "uid" und "pwd" angeben, es macht allerdings überhaupt keinen Unterschied. Dann kam mir die Idee, erst nach dem erfolgreichen Login die Datenbank zu wechseln: Ich verbinde mich also ohne der Angabe einer Datenbank, und er meint Connection ist Open. Dann ruf ich die Methode zum Wechseln auf, z.B.: Connection.ChangeDatabase("mybench") Aber dann ist der User wieder draußen. Es erscheint der selbe fehler wie oben. Und das lustige ist, dass beim Debuggen der Connection-Klasse die einzelnen "Key-Value-Pairs" aus dem Connection-String "übernommen" wurden, und die auch bleiben, aber er will einfach nicht damit weitermachen. Kann es was Server-Seitiges sein ??? Hat jemand eine Idee?? Gruß
Dein User muss auch die Berechtigungen für die Datenbank haben, das Leerzeichen scheint mir da auch fehl am platze und die Doku (wozu irgendwelche Seiten konsultieren wenn es hier: http://dev.mysql.com/doc/refman/5.5/en/connector-net.html schon steht?) spricht auch von Pwd und uid. Lass dir doch den Connectstring mal als fertigen String ausgeben und poste den hier, ggf. PW mit **** ersetzen.
Danke für den Link, und die Tipps. Der ConnectionString lautet: server=10.121.60.1;port=3306;uid=vbnet;pwd=1234;database=mybench Es lag wirklich an den Rechten, ich durfte mich nicht als "localhost" verbinden. Ich habe keine Datenbank-spezifischen Rechte vergeben. Diese Wildcard-Angabe "%" als Hostname für "Jeder Host" funktioniert bei mir nicht, wenn ich mich über localhost / 127.0.0.1 / loopback verbinden will. Ich muss die IP-Adresse einer aktiven Schnittstelle angeben. Anscheinend braucht man wirklich einen (gleichnamigen) extra User für localhost - das wusste ich nicht. Gruß
Timmey S. schrieb: > Anscheinend braucht man wirklich einen (gleichnamigen) extra User für > localhost - das wusste ich nicht. Kommt darauf an wie deine Konfig aussieht und welches Tool du benutzt eigentlich müsste @% klappen hab ich zumindest in meiner Konfiguration häufiger, manchmal muss man auch nur die Userrechte mit FLUSH neu einlesen lassen.
Läubi .. schrieb: > Kommt darauf an wie deine Konfig aussieht und welches Tool du benutzt Verwende XAMPP 1.7.7 mit phpMyAdmin 3.4.5 und dessen Konfig ist noch ziemlich "original" - Soll heißen, dass ich keine großen Änderungen an den Config-Files vorgenommen habe. Auch nicht an den MySQL-Sever Files oder der "my.ini" selbst. Nur die Zeile #bind-address="127.0.0.1" wurde auskommentiert. (Das macht im Bezug auf den Userlogin aber keinen Unterschied) Hab nun nochmals versucht einen User einzurichten. Die Angabe "@%" wird vom phpMyAdmin nicht zugelassen. (Ich glaub der schreibt das "@" selber vorne dran) Bei "Jeder Host" wird ein einfaches "%" vorgegeben. (Siehe zweites Bild oben) Der User wurde erstellt, und die Userrechte mit FLUSH neu eingelesen (Danke für den Tipp), es brachte jedoch nicht viel. Man muss es anscheinend "doppelt" einrichten, da der Zugriff über loopback etwas anders abläuft, als wenn man von außerhalb übers Netzwerk zugreifen will - Also man sollte sowohl für "%" als auch für localhost einen User einrichten. Das ist wahrscheinlich irgendwas wegen der Sicherheit beim Authentifizieren. Kennst du eine Konfiguration, mit der auch ein einzelner User-Eintrag reichen würde ???
Unter Projekt-->Verweise die Mysql.data einbinden Unter MyProject-->Einstellungen folgendes anlegen: Hostname String Username String Password String Database String Public Connection As New MySql.Data.MySqlClient.MySqlConnection Public Function DBConnect() Try If Connection.State <> ConnectionState.Closed Then Connection.Close() Connection.ConnectionString = ("server=" & My.Settings.Hostname & ";uid=" & My.Settings.Username & ";pwd=" & My.Settings.Password & ";database=" & My.Settings.Database & ";") Connection.Open() Return True Catch ex As Exception ErrorHandler("Die Verbindung zur Datenbank konnte nicht hergestellt werden. " & vbCr & ex.Message & vbCr & " Bitte kontaktieren Sie bitte ihren Systemadministrator.") Return False End Try End Function Public Function ExecuteCmd(ByVal Cmd As String) Try Dim Command As New MySql.Data.MySqlClient.MySqlCommand Dim DataAdapter As New MySql.Data.MySqlClient.MySqlDataAdapter Command.Connection = Connection Command.CommandText = (Cmd) Return Command.ExecuteNonQuery() Catch ex As Exception ErrorHandler(ex.Message) End End Try End Function Public Function ExecuteQry(ByVal Cmd As String) Try Dim Command As New MySql.Data.MySqlClient.MySqlCommand Dim DataAdapter As New MySql.Data.MySqlClient.MySqlDataAdapter Dim DataTable As New DataTable Command.Connection = Connection Command.CommandText = Cmd DataAdapter.SelectCommand = Command DataAdapter.Fill(DataTable) Return DataTable Catch ex As Exception ErrorHandler(ex.Message) End End Try End Function Public Sub ErrorHandler(ByVal Message As String, Optional ByVal ShowMsg As Boolean = True, Optional ByVal EndApplication As Boolean = True) Dim oStream As IO.StreamWriter = System.IO.File.AppendText(Application.StartupPath & "\Log_" & Format$(Now, "dd-MM-yyyy") & ".log") oStream.WriteLine(Now & " - " & Message) oStream.Close() If EndApplication = True Then If ShowMsg = True Then MsgBox("Es ist ein schwerwiegender Fehler aufgetreten. " & vbCr & Message & vbCr & "Das Programm muss beendet werden.", MsgBoxStyle.Critical, "Schwerwiegender Fehler") End Else If ShowMsg = True Then MsgBox("Es ist ein schwerwiegender Fehler aufgetreten. " & vbCr & Message, MsgBoxStyle.Critical, "Schwerwiegender Fehler") End If End Sub Das benutze ich seit Monaten ohne Probleme in einem kleinen Privatprojekt für meine DVD-Sammlung
@Oliver Heinrichs: Nettes Snippet. Ich habe die Verweise bereits drinnen, und die Stellen zum Verbinden und zum Querys & CMD´s Ausführen schon selber geschrieben, da gab es keine Schwierigkeiten - Deinen ErrorHandler hab ich mir mal geklaut.. Danke... Das Problem war nur etwas Serverseitiges mit den Rechten. Timmey S. schrieb: > Anscheinend braucht man wirklich einen (gleichnamigen) extra User für > localhost - das wusste ich nicht. Timmey S. schrieb: > Also man sollte sowohl für "%" als auch für localhost > einen User einrichten. Gruß
Timmey S. schrieb: > Das Problem war nur etwas Serverseitiges mit den Rechten. Läuft auf nem Xampp 3.0.12 Nur der Mysql-Server mit geändertem root-Passwort und erstellter DB auf nem Win7Ultimate (6.1 Build 7600) Der ErrorHandler war eigentlich einfach nur dahingerotzt. Aber funktioniert so. Sollte man vielleicht, je nach Projekt, das Optional ByVal EndApplication As Boolean = True in Optional ByVal EndApplication As Boolean = False ändern...
Oliver Heinrichs schrieb: > Läuft auf nem Xampp 3.0.12 Wo gibt es den ?? XAMPP Homepage schrieb am 01.Okt 2012 00:29:51 CEST: > Die neue XAMPP 1.8.1 Version [Edit] Achso du meinst wahrscheinlich das Controll-Panel.. OK ^^
Uuups. Das ControlPanel ist 3.0.12 Wo find ich die Xampp-Version? Aaah. ReadMe 1.8.0
Ich hab das normalerweise, fast alles (bis auf die Variable der Connection) in einem eigenen Modul. Ist angehängt. Edit: Hab mal zurückgelesen. Für den externen Zugriff benötigst du keinen zweiten Benutzer. Es reicht, dem vorhandenen statt des localhost ein % zu verpassen...
Oliver Heinrichs schrieb: > Es reicht, dem vorhandenen statt des localhost > ein % zu verpassen... Dann funktioniert es bei mir komischerweise nicht mehr über 127.0.0.1 ^^ Kannst du mal deine User-Settings Posten, mit denen es bei dir funktioniert? [phpMyAdmin -> Rechte -> User (Liste) -> Exportieren]
1 | GRANT ALL PRIVILEGES ON *.* TO 'vbnet'@'%' IDENTIFIED BY PASSWORD '*ENCRYPTED_KEY_VALUE' WITH GRANT OPTION; |
Muss doch eigentlich klappen. Sieht jemand einen Fehler??? Kennt jemand die "richtigen" User-Settings, bei denen Jeder Host erlaubt ist?
Timmey S. schrieb: > 127.0.0.1 Benutzt du die IP oder den String "localhost"? Schau doch mal wie deine eths konfiguriert sind, eventuell spielt auch noch eine Sicherheitseinstellung mit rein...
Läubi .. schrieb: > Benutzt du die IP oder den String "localhost"? Habe jetzt eigentlich jede Kombination durch. Auch Serverseitig bei den Usern mit "%" \ localhost \ 127.0.0.1. Läubi .. schrieb: > Schau doch mal wie deine eths konfiguriert sind Hab gerade nur eine Schnittstelle Aktiv. Wenn ich dessen IP vom eigenen Host aus anspreche funktioniert es. Also der Loopback übers OS geht, und die IP der Schnittstelle wird akzeptiert. Von außen ansprechen geht auch. Habe keine virtuellen IP´s oder sonnst was laufen. Die Verbindung zwischen MySQL und VB.Net funktioniert auf jeden Fall - Sonnst wäre die Fehlermeldung auch ganz anders, wie z.B. "Unable to connect to any of the specified MySql hosts". Sicherheitseinstellung? Keine Ahnung was da noch so mit einfließen kann. Eine Firewall oder irgendwelche blockierenden Applications habe gerade auch nicht laufen, und würde ich auch ausschließen. Der "Fehler" ist bestimmt beim MySQL und dessen Rechten zu suchen. (Verwende nur globale Rechte, also keine Datenbank-spezifischen Sachen) In den "Default-Configs" sind User doch auch mehrfach vorhanden (Siehe Bild). Da gibt es "Jeder" und "Root" auch zwei mal - mit unterschiedlichen Hosts. Da wird sogar noch 127.0.0.1 und localhost getrennt, obwohl "localhost" doch eigentlich nach "127.0.0.1" aufgelöst werden sollte...!?!? Sicher, dass ein "%" in jedem Fall ausreicht?? Das einfachste wäre wohl [Test Weise] den Server neu aufzusetzen bzw. Updaten Überschreiben und ein neueres XAMPP laufen zu lassen, bevor ich die Nadel im Heuhaufen suche.... Oder einfach einen zweiten User-Eintrag spendieren, wenn es keine andere Lösung gibt.
Hab nun zweiten User für "localhost" eingerichtet, ohne weiter nach dem "Fehler" zu suchen. Jetzt habe ich noch eine kurze Frage: Weiß jemand, wie man bei einem Select-Query die "Eigenschaften" einer Tabelle mit in das DataTable bekommt? Also z.B. dass es Auto-Increment gibt, oder dass eine "Default-Value" vorhanden ist oder dass "Null" erlaubt ist. Es wäre ziemlich praktisch, dass in einem Table zu haben. Momentan wird das nicht mit-übernommen. Bekomme ich die genannten Eigenschaften über das Schema? Oder bekomme ich das auch aus diversen Querys? Oder kann das dieser MySqlDataAdapter? Hat da jemand einen Tipp / Erfahrung für mich??? Soll ich einen neuen Thread dafür aufmachen? Danke schon mal.
Timmey S. schrieb: > Sonnst wäre die Fehlermeldung auch ganz anders Ja aber für die Rechteverwaltung sit das relevant, hier steht wie es genau funktioniert: http://dev.mysql.com/doc/refman/5.1/de/connection-access.html Angeblich tritt das Problem auf, wenn man einen (default) user ''@localhost hat, du kanns mal versuchen:
1 | DELETE FROM mysql.user WHERE Host='localhost' AND User=''; |
2 | FLUSH PRIVILEGES; |
Ansosnten ist es auch nicht schlimm mehrere 'gleiche' User zu haben mit unterschiedlichen Hostnames, eigentlich ist das sogar etwas sicherer je restriktiver man das gestaltet. Timmey S. schrieb: > Weiß jemand, wie man bei einem > Select-Query die "Eigenschaften" einer Tabelle Kenne mich in VB.net nicht so aus aber meistens gibt es bei der Connection (oder auch bei Resultsets) die Möglichkeit sich die Metadaten abzurufen, alternativ kann man die Daten auch direkt aus dem information_schema auslesen.
1 | DELETE FROM mysql.user WHERE Host='localhost' AND User=''; |
2 | # 1 Zeile betroffen. |
Find ich saaauumäßig cool von dir, ohne scheiß. Jetzt funktioniert es tatsächlich! Super Ferndiagnose. Echt spitze Läubi ^^. Darauf wäre ich wirklich nicht gekommen, und hätte wahrscheinlich auch nicht weiter danach gesucht. Läubi .. schrieb: > alternativ kann man die Daten auch direkt aus dem > information_schema auslesen. Momentan finde ich auch keine andere Möglichkeit. Ich muss alle Daten selber zusammenkratzen und mit in das "DataTable" schreiben. Wenn jemand eine elegantere Methode (oder eine Klasse dafür) kennt, wäre ich sehr daran interessiert. Bis dahin ist der Thread wohl beendet... [Mal wieder ein voll erfolgreicher Thread, ohne ein bisschen Meckern, Trollen, oder etc. Auch wenn das eigentliche Problem wirklich gar nichts mehr mit dem Betreff im Eingangspost zu tun hat. Sogar die Rechtschreibung wurde einfach so hingenommen, Respekt ^^] Ich bedanke mich für wirklich jeden einzelnen Beitrag, war echt sehr informativ, und hilfreich. Gruß, TS
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.