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 ^^
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.
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