Forum: PC-Programmierung Vb.net: MySQL Connection-String?


von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

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ß

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Angehängte Dateien:

Lesenswert?

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ß

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

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 ???

von Oliver H. (Firma: OliverHeinrichs.de) (dobson)


Lesenswert?

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

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

@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ß

von Oliver H. (Firma: OliverHeinrichs.de) (dobson)


Lesenswert?

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

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

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

von Oliver H. (Firma: OliverHeinrichs.de) (dobson)


Lesenswert?

Uuups. Das ControlPanel ist 3.0.12
Wo find ich die Xampp-Version?
Aaah. ReadMe
1.8.0

von Oliver H. (Firma: OliverHeinrichs.de) (dobson)


Angehängte Dateien:

Lesenswert?

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

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

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?

von Oliver H. (Firma: OliverHeinrichs.de) (dobson)


Lesenswert?

quasi das gleiche...

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Hmmm **confused** ;-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.