Discussion:
Automatische Verknüpfung einer MySQL-Tabelle
(zu alt für eine Antwort)
Jens Mertens
2005-12-14 17:35:08 UTC
Permalink
Hi All,

Über "Datei"-->"Externe Daten"-->"Tabelle verknüpfen" kann ich eine
"Computerdatenquelle" zu einer MySQL-Tabelle verknüpfen. Leider scheint die
Verbindung nicht sonderlich gut zu sein: beim erstmaligen Verknüpfen kann
ich zwar lesend auf die Tabelle zugreifen, aber nun funktioniert es ab und
zu nicht und folgende Meldung wird ausgegeben:

"ODBC-Verbindung zu 'Servername' fehlgeschlagen"

Da ich sehr häufig aus meiner Access-ANwendung auf die verknüpfte
MySQL-Tabelle zugreife, würde ich lieber auf Nummer Sicher gehen und statt
dem "Externe Daten"-->"Tabelle verknüpfen" lieber "..importieren" verwenden.

Nun meine Frage: Wie kann ich per VBA automatisch beim Starten einer
Access-Anwendung immer wieder aufs Neue meine MySQL-Tabelle importieren? Den
Klickpfad "Datei"-->"Externe Daten"-->"...importieren" müsste man doch mit
VBA nachprogrammieren können - wie wären die VBA-Befehle dazu?

Gruss, Jens
Philipp Stiefel
2005-12-14 19:25:03 UTC
Permalink
Post by Jens Mertens
Nun meine Frage: Wie kann ich per VBA automatisch beim Starten einer
Access-Anwendung immer wieder aufs Neue meine MySQL-Tabelle importieren? Den
Klickpfad "Datei"-->"Externe Daten"-->"...importieren" müsste man doch mit
VBA nachprogrammieren können - wie wären die VBA-Befehle dazu?
Ich würde die Tabelle in Access leer anlegen bzw.
löschen und die Daten über eine Pass-Through-Abfrage
in die Tabellenstruktur importieren.

Gruß
Phil
--
Bitte verwendet für Fragen zu Access mit DBMS-Server-Backends
die Newsgroup microsoft.public.de.access.clientserver! Danke!

Richtig zitieren im Usenet -> http://got.to/quote
Jens Mertens
2005-12-15 08:26:24 UTC
Permalink
Hi Phil,

danke für deinen Tipp, könntest du mir noch ansatzweise beschreiben, wie das
mit der Pass-Through-Abfrage funktioniert?

gruss, jens
Post by Philipp Stiefel
Post by Jens Mertens
Nun meine Frage: Wie kann ich per VBA automatisch beim Starten einer
Access-Anwendung immer wieder aufs Neue meine MySQL-Tabelle importieren? Den
Klickpfad "Datei"-->"Externe Daten"-->"...importieren" müsste man doch mit
VBA nachprogrammieren können - wie wären die VBA-Befehle dazu?
Ich würde die Tabelle in Access leer anlegen bzw.
löschen und die Daten über eine Pass-Through-Abfrage
in die Tabellenstruktur importieren.
Gruß
Phil
--
Bitte verwendet für Fragen zu Access mit DBMS-Server-Backends
die Newsgroup microsoft.public.de.access.clientserver! Danke!
Richtig zitieren im Usenet -> http://got.to/quote
Gernot Adams
2005-12-15 08:52:45 UTC
Permalink
hi,
Post by Jens Mertens
Über "Datei"-->"Externe Daten"-->"Tabelle verknüpfen" kann ich eine
"Computerdatenquelle" zu einer MySQL-Tabelle verknüpfen. Leider scheint die
Verbindung nicht sonderlich gut zu sein: beim erstmaligen Verknüpfen kann
ich zwar lesend auf die Tabelle zugreifen, aber nun funktioniert es ab und
"ODBC-Verbindung zu 'Servername' fehlgeschlagen"
Da ich sehr häufig aus meiner Access-ANwendung auf die verknüpfte
MySQL-Tabelle zugreife, würde ich lieber auf Nummer Sicher gehen und statt
dem "Externe Daten"-->"Tabelle verknüpfen" lieber "..importieren" verwenden.
zwar keine Antwort auf Deine Frage aber auch aufgrund Deines erstens
Postings "Probleme mit MyODBC" ist es vielleicht für Dich hilfreich, zu
sehen, wie man die Tabellenverknüpfungen per VBA herstellen kann (das was
Josef im ersten Posting als DSN less bezeichnet hat). Ich mache das in einem
Anmeldeformular so:

'Alle Tabellen neu verlinken

Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef
Dim strConnectTable As String
Dim strConnectQuery As String

Set dbs = CurrentDb

' Eingabefelder des Anmeldeformulars
Database = Me!Database
Servername = Me!Servername
username = Me!username
password = Me!password

' ODBC-Connectstrings zusammensetzen
strConnectTable = "DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" & Servername &
";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" & password &
";OPTION=259;"

strConnectQuery = "ODBC;DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" &
Servername & ";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" &
password & ";OPTION=259;"

' Tabellen neu verlinken
For Each tdf In dbs.TableDefs
If Left$(tdf.Connect, 4) = "ODBC" Then
tdf.Connect = strConnectTable
' = Connection-String inkl. User und PWD
tdf.RefreshLink
End If
Next tdf


' Abfragen neu verlinken
For Each qdf In dbs.QueryDefs
If qdf.Connect > "" Then
qdf.Connect = strConnectQuery
End If
Next qdf

' Anmeldeform schließen und Hauptform öffnen
DoCmd.OpenForm "frmMainform"
DoCmd.Close acForm, "frmStart"

End Sub


Du müßtest also zunächst einen DSN-Eintrag erstellen (die genauen
Konfigurationsparameter finden sich hier:
http://dev.mysql.com/doc/refman/5.0/en/dsn-on-windows.html oder auch hier:
http://www.connectionstrings.com/) und die Tabellen im Backend "zu Fuß"
verlinken - also über Datei -> Externe Daten -> Tabellen.

Hierdurch speichert Access den Verbindungsstring mit dem DSN-Eintrag in der
Systemtabelle MSysObjects ab. Danach verknüpfst Du die Tabellen mittels des
o.g. Codes nochmal. Access ändert daraufhin im Verbindungsstring den Eintrag
von DSN zu ODBC. Danach kannst Du auf den DSN-Eintrag verzichten.

Bei jedem Hinzufügen einer neuen Tabelle im Backend mußt Du dann allerdings
diese neue Tabelle erstmal wieder zu Fuß verlinken, um dann wieder mittels
des o.g. Codes den String zu ändern (aber auch das läßt sich mit Sicherheit
anders machen, obgleich ich jetzt nicht sagen kann, wie).

Gruß
Gernot
Josef Poetzl
2005-12-15 09:35:46 UTC
Permalink
Hallo!
Post by Gernot Adams
zwar keine Antwort auf Deine Frage aber auch aufgrund Deines erstens
Postings "Probleme mit MyODBC" ist es vielleicht für Dich hilfreich, zu
sehen, wie man die Tabellenverknüpfungen per VBA herstellen kann (das was
Josef im ersten Posting als DSN less bezeichnet hat). Ich mache das in einem
[...]
Post by Gernot Adams
Bei jedem Hinzufügen einer neuen Tabelle im Backend mußt Du dann allerdings
diese neue Tabelle erstmal wieder zu Fuß verlinken, um dann wieder mittels
des o.g. Codes den String zu ändern (aber auch das läßt sich mit Sicherheit
anders machen, obgleich ich jetzt nicht sagen kann, wie).
Man könnte Deinen "Anmeldeformular"-Code erweitert und auch das
verknüpfen einer Tabelle per Code durchführt. ;-)

sTabNameFE = "Tabellenname im FE"
sTabNameBE = "Tabellenname im BE"
sOdbcConnectionString = "ODBC;...."
bSavePWD = cbool(Soll das Passwort gespeichert werden?)

Set tdf = dbs.CreateTableDef(sTabNameFE)
tdf.SourceTableName = sTabNameBE
tdf.Connect = sOdbcConnectionString
dbs.TableDefs.Append tdf
If bSavePWD Then
If (tdf.Attributes And dbAttachSavePWD) = 0 Then
tdf.Attributes = dbAttachSavePWD
End If
End If
tdf.RefreshLink


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Jens Mertens
2005-12-15 15:06:30 UTC
Permalink
Hi Gernot,

auch dir herzlichen Dank für die ausführlich Antwort.

Leider muss ich die mySQL-Tabelle bei jedem Öffnen der Access-Datei neu
importieren, da eine verknüpfte Tabelle auf Grund mit nicht erklärlicher
Verbindungsprobleme zwischendurch Probleme macht. Mit deinem VBA-Code könnte
ich zwar problemlos eine Tabelle automatisch verknüpfen, aber nicht
importieren.

-> welchen VBA-Befehl kann ich denn zum automatischen importieren einer
mySQL-Tabelle verwenden?

danke und herzliche grüße!

MFG, jens
Post by Jens Mertens
hi,
Post by Jens Mertens
Über "Datei"-->"Externe Daten"-->"Tabelle verknüpfen" kann ich eine
"Computerdatenquelle" zu einer MySQL-Tabelle verknüpfen. Leider scheint
die
Post by Jens Mertens
Verbindung nicht sonderlich gut zu sein: beim erstmaligen Verknüpfen kann
ich zwar lesend auf die Tabelle zugreifen, aber nun funktioniert es ab und
"ODBC-Verbindung zu 'Servername' fehlgeschlagen"
Da ich sehr häufig aus meiner Access-ANwendung auf die verknüpfte
MySQL-Tabelle zugreife, würde ich lieber auf Nummer Sicher gehen und statt
dem "Externe Daten"-->"Tabelle verknüpfen" lieber "..importieren"
verwenden.
zwar keine Antwort auf Deine Frage aber auch aufgrund Deines erstens
Postings "Probleme mit MyODBC" ist es vielleicht für Dich hilfreich, zu
sehen, wie man die Tabellenverknüpfungen per VBA herstellen kann (das was
Josef im ersten Posting als DSN less bezeichnet hat). Ich mache das in einem
'Alle Tabellen neu verlinken
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef
Dim strConnectTable As String
Dim strConnectQuery As String
Set dbs = CurrentDb
' Eingabefelder des Anmeldeformulars
Database = Me!Database
Servername = Me!Servername
username = Me!username
password = Me!password
' ODBC-Connectstrings zusammensetzen
strConnectTable = "DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" & Servername &
";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" & password &
";OPTION=259;"
strConnectQuery = "ODBC;DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" &
Servername & ";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" &
password & ";OPTION=259;"
' Tabellen neu verlinken
For Each tdf In dbs.TableDefs
If Left$(tdf.Connect, 4) = "ODBC" Then
tdf.Connect = strConnectTable
' = Connection-String inkl. User und PWD
tdf.RefreshLink
End If
Next tdf
' Abfragen neu verlinken
For Each qdf In dbs.QueryDefs
If qdf.Connect > "" Then
qdf.Connect = strConnectQuery
End If
Next qdf
' Anmeldeform schließen und Hauptform öffnen
DoCmd.OpenForm "frmMainform"
DoCmd.Close acForm, "frmStart"
End Sub
Du müßtest also zunächst einen DSN-Eintrag erstellen (die genauen
http://www.connectionstrings.com/) und die Tabellen im Backend "zu Fuß"
verlinken - also über Datei -> Externe Daten -> Tabellen.
Hierdurch speichert Access den Verbindungsstring mit dem DSN-Eintrag in der
Systemtabelle MSysObjects ab. Danach verknüpfst Du die Tabellen mittels des
o.g. Codes nochmal. Access ändert daraufhin im Verbindungsstring den Eintrag
von DSN zu ODBC. Danach kannst Du auf den DSN-Eintrag verzichten.
Bei jedem Hinzufügen einer neuen Tabelle im Backend mußt Du dann allerdings
diese neue Tabelle erstmal wieder zu Fuß verlinken, um dann wieder mittels
des o.g. Codes den String zu ändern (aber auch das läßt sich mit Sicherheit
anders machen, obgleich ich jetzt nicht sagen kann, wie).
Gruß
Gernot
Jens Mertens
2005-12-15 15:39:58 UTC
Permalink
Hi,
eigentlich wollte ich ja per VBA eine MySQL-Tabelle jedes Mal beim Start der
Access-Datei neu importieren. das habe ich noch nicht geschafft, dafür habe
ich es nun geschafft, direkt aus einer MySQL-Tabelle Daten in ein Recordset
einzulesen.

Wie kann ich die Daten dieses RecordsSets denn nun jedes Mal in beim Start
der Access-Datei in eine Tabelle testtabelleaccess rüberschieben? (Vorher
würde ich ein delete from testtabelleaccess machen)

Folgenden Code benutze ich nun:

Public Sub dbConnect()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String

On Error GoTo errorhandler


Set conn = New ADODB.Connection

conn.Open ("DRIVER={MySQL ODBC 3.51 Driver};" & _
"Server=azubis.bauer.com;" & _
"Port=3306;" & _
"Option=16384;" & _
"Stmt=;" & _
"Database=testdbMysql;" & _
"Uid=username;" & _
"Pwd=geheim")
strSQL = "SELECT * FROM testtabellemysql"

Set rs = New ADODB.Recordset
rs.Open strSQL, conn
Debug.Print rs("title")
' Wie kann ich die Daten des RecordSets rs in die lokale Tabelle
testtabelleaccess bekommen
' ohne durch jede Zeile durchzuloopen?

exit_dbconnect:
Exit Sub
errorhandler:
MsgBox Err.Description
MsgBox Err.Number
Resume exit_dbconnect

End Sub

Gruss, Jens
Post by Jens Mertens
Hi Gernot,
auch dir herzlichen Dank für die ausführlich Antwort.
Leider muss ich die mySQL-Tabelle bei jedem Öffnen der Access-Datei neu
importieren, da eine verknüpfte Tabelle auf Grund mit nicht erklärlicher
Verbindungsprobleme zwischendurch Probleme macht. Mit deinem VBA-Code
könnte ich zwar problemlos eine Tabelle automatisch verknüpfen, aber nicht
importieren.
-> welchen VBA-Befehl kann ich denn zum automatischen importieren einer
mySQL-Tabelle verwenden?
danke und herzliche grüße!
MFG, jens
Post by Jens Mertens
hi,
Post by Jens Mertens
Über "Datei"-->"Externe Daten"-->"Tabelle verknüpfen" kann ich eine
"Computerdatenquelle" zu einer MySQL-Tabelle verknüpfen. Leider scheint
die
Post by Jens Mertens
Verbindung nicht sonderlich gut zu sein: beim erstmaligen Verknüpfen kann
ich zwar lesend auf die Tabelle zugreifen, aber nun funktioniert es ab und
"ODBC-Verbindung zu 'Servername' fehlgeschlagen"
Da ich sehr häufig aus meiner Access-ANwendung auf die verknüpfte
MySQL-Tabelle zugreife, würde ich lieber auf Nummer Sicher gehen und statt
dem "Externe Daten"-->"Tabelle verknüpfen" lieber "..importieren"
verwenden.
zwar keine Antwort auf Deine Frage aber auch aufgrund Deines erstens
Postings "Probleme mit MyODBC" ist es vielleicht für Dich hilfreich, zu
sehen, wie man die Tabellenverknüpfungen per VBA herstellen kann (das was
Josef im ersten Posting als DSN less bezeichnet hat). Ich mache das in einem
'Alle Tabellen neu verlinken
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef
Dim strConnectTable As String
Dim strConnectQuery As String
Set dbs = CurrentDb
' Eingabefelder des Anmeldeformulars
Database = Me!Database
Servername = Me!Servername
username = Me!username
password = Me!password
' ODBC-Connectstrings zusammensetzen
strConnectTable = "DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" & Servername &
";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" & password &
";OPTION=259;"
strConnectQuery = "ODBC;DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" &
Servername & ";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" &
password & ";OPTION=259;"
' Tabellen neu verlinken
For Each tdf In dbs.TableDefs
If Left$(tdf.Connect, 4) = "ODBC" Then
tdf.Connect = strConnectTable
' = Connection-String inkl. User und PWD
tdf.RefreshLink
End If
Next tdf
' Abfragen neu verlinken
For Each qdf In dbs.QueryDefs
If qdf.Connect > "" Then
qdf.Connect = strConnectQuery
End If
Next qdf
' Anmeldeform schließen und Hauptform öffnen
DoCmd.OpenForm "frmMainform"
DoCmd.Close acForm, "frmStart"
End Sub
Du müßtest also zunächst einen DSN-Eintrag erstellen (die genauen
http://www.connectionstrings.com/) und die Tabellen im Backend "zu Fuß"
verlinken - also über Datei -> Externe Daten -> Tabellen.
Hierdurch speichert Access den Verbindungsstring mit dem DSN-Eintrag in der
Systemtabelle MSysObjects ab. Danach verknüpfst Du die Tabellen mittels des
o.g. Codes nochmal. Access ändert daraufhin im Verbindungsstring den Eintrag
von DSN zu ODBC. Danach kannst Du auf den DSN-Eintrag verzichten.
Bei jedem Hinzufügen einer neuen Tabelle im Backend mußt Du dann allerdings
diese neue Tabelle erstmal wieder zu Fuß verlinken, um dann wieder mittels
des o.g. Codes den String zu ändern (aber auch das läßt sich mit Sicherheit
anders machen, obgleich ich jetzt nicht sagen kann, wie).
Gruß
Gernot
Jens Mertens
2005-12-15 16:51:23 UTC
Permalink
OK, das kopieren der aus der MySQL-Tabelle in ein RecordSet eingelesenen
Daten in eine lokale Accesstabelle werde ich nun machen, indem ich durch das
RecordSet durchloope.

Leider habe ich noch ein ziemliches Problem, mit dem Verbindungsaufbau. Auf
der Test-MySQL-DB habe ich einen MySQL-User mit Vollzugriff und alles klappt
ohne Probleme. Wenn ich nun jedoch versuche, auf vom produktivem
MySQL-Server die gewünschte Tabelle mit einem User, der NUR LESERECHT dort
hat, auszulesen, dann erhalte immer folgende Meldung:

[MySQL][ODBC 3.51 Driver]Access denied for user
'kostenstelle'@'172.28.53.245' (using password: YES)

und gleich danach die Meldung -2147467259

Wenn ich auf der Konsole eine Verbindung aufbaue, dann klappt das
problemlos:

C:\>mysql -h servername.com -u kostenstelle -p otrs
Enter password: *******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 129166 to server version: 4.1.11-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show tables;
+-----------------+
| Tables_in_otrs |
+-----------------+
| ze_kostenstelle |
+-----------------+
1 row in set (0.00 sec)
(ein select * from ze_kostenstelle klappt auch einwandfrei)

Wenn ich es jedoch mit VBA versuche, dann kommen o.g. beide
Fehlermeldungen!!

Public Sub dbConnect()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
Dim db As Database

On Error GoTo errorhandler

Set db = CurrentDb
Set conn = New ADODB.Connection

conn.Open ("DRIVER={MySQL ODBC 3.51 Driver};" & _
"Server=servername.com;" & _
"Port=3306;" & _
"Option=16384;" & _
"Stmt=;" & _
"Database=otrs;" & _
"Uid=kostenstelle;" & _
"Pwd=geheim")
strSQL = "SELECT * FROM ze_kostenstelle"

[...]

exit_dbconnect:
Exit Sub
errorhandler:
MsgBox Err.Description 'hier die erste fehlermeldung [MySQL][ODBC 3.51
Driver]Access denied for user 'kostenstelle'@'172.28.53.245' (using
password: YES)
MsgBox Err.Number 'hier der errorcode -2147467259
Resume exit_dbconnect
End Sub

Woran kann es liegen, dass ich mit gleichen User-Credentials auf der CMD
eine DB-Verbindung zur produktiven MySQL-DB aufbauen kann (über
"Datei"-->"Externe Daten" klappt es auch!) ABER über VBA nicht? Was für
Parameter kann ich bei Option= denn noch angeben? Kann es etwas damit zu tun
haben?

Gruss, Jens
Post by Jens Mertens
Hi,
eigentlich wollte ich ja per VBA eine MySQL-Tabelle jedes Mal beim Start
der Access-Datei neu importieren. das habe ich noch nicht geschafft, dafür
habe ich es nun geschafft, direkt aus einer MySQL-Tabelle Daten in ein
Recordset einzulesen.
Wie kann ich die Daten dieses RecordsSets denn nun jedes Mal in beim Start
der Access-Datei in eine Tabelle testtabelleaccess rüberschieben? (Vorher
würde ich ein delete from testtabelleaccess machen)
Public Sub dbConnect()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
On Error GoTo errorhandler
Set conn = New ADODB.Connection
conn.Open ("DRIVER={MySQL ODBC 3.51 Driver};" & _
"Server=azubis.bauer.com;" & _
"Port=3306;" & _
"Option=16384;" & _
"Stmt=;" & _
"Database=testdbMysql;" & _
"Uid=username;" & _
"Pwd=geheim")
strSQL = "SELECT * FROM testtabellemysql"
Set rs = New ADODB.Recordset
rs.Open strSQL, conn
Debug.Print rs("title")
' Wie kann ich die Daten des RecordSets rs in die lokale Tabelle
testtabelleaccess bekommen
' ohne durch jede Zeile durchzuloopen?
Exit Sub
MsgBox Err.Description
MsgBox Err.Number
Resume exit_dbconnect
End Sub
Gruss, Jens
Post by Jens Mertens
Hi Gernot,
auch dir herzlichen Dank für die ausführlich Antwort.
Leider muss ich die mySQL-Tabelle bei jedem Öffnen der Access-Datei neu
importieren, da eine verknüpfte Tabelle auf Grund mit nicht erklärlicher
Verbindungsprobleme zwischendurch Probleme macht. Mit deinem VBA-Code
könnte ich zwar problemlos eine Tabelle automatisch verknüpfen, aber
nicht importieren.
-> welchen VBA-Befehl kann ich denn zum automatischen importieren einer
mySQL-Tabelle verwenden?
danke und herzliche grüße!
MFG, jens
Post by Jens Mertens
hi,
Post by Jens Mertens
Über "Datei"-->"Externe Daten"-->"Tabelle verknüpfen" kann ich eine
"Computerdatenquelle" zu einer MySQL-Tabelle verknüpfen. Leider scheint
die
Post by Jens Mertens
Verbindung nicht sonderlich gut zu sein: beim erstmaligen Verknüpfen kann
ich zwar lesend auf die Tabelle zugreifen, aber nun funktioniert es ab und
"ODBC-Verbindung zu 'Servername' fehlgeschlagen"
Da ich sehr häufig aus meiner Access-ANwendung auf die verknüpfte
MySQL-Tabelle zugreife, würde ich lieber auf Nummer Sicher gehen und statt
dem "Externe Daten"-->"Tabelle verknüpfen" lieber "..importieren"
verwenden.
zwar keine Antwort auf Deine Frage aber auch aufgrund Deines erstens
Postings "Probleme mit MyODBC" ist es vielleicht für Dich hilfreich, zu
sehen, wie man die Tabellenverknüpfungen per VBA herstellen kann (das was
Josef im ersten Posting als DSN less bezeichnet hat). Ich mache das in einem
'Alle Tabellen neu verlinken
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef
Dim strConnectTable As String
Dim strConnectQuery As String
Set dbs = CurrentDb
' Eingabefelder des Anmeldeformulars
Database = Me!Database
Servername = Me!Servername
username = Me!username
password = Me!password
' ODBC-Connectstrings zusammensetzen
strConnectTable = "DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" & Servername &
";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" & password &
";OPTION=259;"
strConnectQuery = "ODBC;DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" &
Servername & ";DATABASE=" & Database & ";USER=" & username &
";PASSWORD=" &
password & ";OPTION=259;"
' Tabellen neu verlinken
For Each tdf In dbs.TableDefs
If Left$(tdf.Connect, 4) = "ODBC" Then
tdf.Connect = strConnectTable
' = Connection-String inkl. User und PWD
tdf.RefreshLink
End If
Next tdf
' Abfragen neu verlinken
For Each qdf In dbs.QueryDefs
If qdf.Connect > "" Then
qdf.Connect = strConnectQuery
End If
Next qdf
' Anmeldeform schließen und Hauptform öffnen
DoCmd.OpenForm "frmMainform"
DoCmd.Close acForm, "frmStart"
End Sub
Du müßtest also zunächst einen DSN-Eintrag erstellen (die genauen
http://www.connectionstrings.com/) und die Tabellen im Backend "zu Fuß"
verlinken - also über Datei -> Externe Daten -> Tabellen.
Hierdurch speichert Access den Verbindungsstring mit dem DSN-Eintrag in der
Systemtabelle MSysObjects ab. Danach verknüpfst Du die Tabellen mittels des
o.g. Codes nochmal. Access ändert daraufhin im Verbindungsstring den Eintrag
von DSN zu ODBC. Danach kannst Du auf den DSN-Eintrag verzichten.
Bei jedem Hinzufügen einer neuen Tabelle im Backend mußt Du dann allerdings
diese neue Tabelle erstmal wieder zu Fuß verlinken, um dann wieder mittels
des o.g. Codes den String zu ändern (aber auch das läßt sich mit Sicherheit
anders machen, obgleich ich jetzt nicht sagen kann, wie).
Gruß
Gernot
Jens Mertens
2005-12-15 17:00:50 UTC
Permalink
OK, ich bin schon wieder ein Stück weiter, kann mir jemand verraten, wie ich
in VBA ein mySQL-Passwort im Connection-String übergebe, wenn das Passwort
selber ein Semikolon enthält?

conn.Open ("DRIVER={MySQL ODBC 3.51 Driver};" & _
"Server=servername.com;" & _
"Port=3306;" & _
"Option=16384;" & _
"Stmt=;" & _
"Database=otrs;" & _
"Uid=kostenstelle;" & _
"Pwd=ko;84hG")

Ich befürchte, dass mein Fehler (Access denied for user... s.u.) daran
liegt. Kann das sein und wenn ja, wie kann ich das umgehen?

Gruss, Jens
Post by Jens Mertens
OK, das kopieren der aus der MySQL-Tabelle in ein RecordSet eingelesenen
Daten in eine lokale Accesstabelle werde ich nun machen, indem ich durch
das RecordSet durchloope.
Leider habe ich noch ein ziemliches Problem, mit dem Verbindungsaufbau.
Auf der Test-MySQL-DB habe ich einen MySQL-User mit Vollzugriff und alles
klappt ohne Probleme. Wenn ich nun jedoch versuche, auf vom produktivem
MySQL-Server die gewünschte Tabelle mit einem User, der NUR LESERECHT dort
[MySQL][ODBC 3.51 Driver]Access denied for user
und gleich danach die Meldung -2147467259
Wenn ich auf der Konsole eine Verbindung aufbaue, dann klappt das
C:\>mysql -h servername.com -u kostenstelle -p otrs
Enter password: *******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 129166 to server version: 4.1.11-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show tables;
+-----------------+
| Tables_in_otrs |
+-----------------+
| ze_kostenstelle |
+-----------------+
1 row in set (0.00 sec)
(ein select * from ze_kostenstelle klappt auch einwandfrei)
Wenn ich es jedoch mit VBA versuche, dann kommen o.g. beide
Fehlermeldungen!!
Public Sub dbConnect()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
Dim db As Database
On Error GoTo errorhandler
Set db = CurrentDb
Set conn = New ADODB.Connection
conn.Open ("DRIVER={MySQL ODBC 3.51 Driver};" & _
"Server=servername.com;" & _
"Port=3306;" & _
"Option=16384;" & _
"Stmt=;" & _
"Database=otrs;" & _
"Uid=kostenstelle;" & _
"Pwd=geheim")
strSQL = "SELECT * FROM ze_kostenstelle"
[...]
Exit Sub
MsgBox Err.Description 'hier die erste fehlermeldung [MySQL][ODBC 3.51
password: YES)
MsgBox Err.Number 'hier der errorcode -2147467259
Resume exit_dbconnect
End Sub
Woran kann es liegen, dass ich mit gleichen User-Credentials auf der CMD
eine DB-Verbindung zur produktiven MySQL-DB aufbauen kann (über
"Datei"-->"Externe Daten" klappt es auch!) ABER über VBA nicht? Was für
Parameter kann ich bei Option= denn noch angeben? Kann es etwas damit zu
tun haben?
Gruss, Jens
Post by Jens Mertens
Hi,
eigentlich wollte ich ja per VBA eine MySQL-Tabelle jedes Mal beim Start
der Access-Datei neu importieren. das habe ich noch nicht geschafft,
dafür habe ich es nun geschafft, direkt aus einer MySQL-Tabelle Daten in
ein Recordset einzulesen.
Wie kann ich die Daten dieses RecordsSets denn nun jedes Mal in beim
Start der Access-Datei in eine Tabelle testtabelleaccess rüberschieben?
(Vorher würde ich ein delete from testtabelleaccess machen)
Public Sub dbConnect()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
On Error GoTo errorhandler
Set conn = New ADODB.Connection
conn.Open ("DRIVER={MySQL ODBC 3.51 Driver};" & _
"Server=azubis.bauer.com;" & _
"Port=3306;" & _
"Option=16384;" & _
"Stmt=;" & _
"Database=testdbMysql;" & _
"Uid=username;" & _
"Pwd=geheim")
strSQL = "SELECT * FROM testtabellemysql"
Set rs = New ADODB.Recordset
rs.Open strSQL, conn
Debug.Print rs("title")
' Wie kann ich die Daten des RecordSets rs in die lokale Tabelle
testtabelleaccess bekommen
' ohne durch jede Zeile durchzuloopen?
Exit Sub
MsgBox Err.Description
MsgBox Err.Number
Resume exit_dbconnect
End Sub
Gruss, Jens
Post by Jens Mertens
Hi Gernot,
auch dir herzlichen Dank für die ausführlich Antwort.
Leider muss ich die mySQL-Tabelle bei jedem Öffnen der Access-Datei neu
importieren, da eine verknüpfte Tabelle auf Grund mit nicht erklärlicher
Verbindungsprobleme zwischendurch Probleme macht. Mit deinem VBA-Code
könnte ich zwar problemlos eine Tabelle automatisch verknüpfen, aber
nicht importieren.
-> welchen VBA-Befehl kann ich denn zum automatischen importieren einer
mySQL-Tabelle verwenden?
danke und herzliche grüße!
MFG, jens
Post by Jens Mertens
hi,
Post by Jens Mertens
Über "Datei"-->"Externe Daten"-->"Tabelle verknüpfen" kann ich eine
"Computerdatenquelle" zu einer MySQL-Tabelle verknüpfen. Leider scheint
die
Post by Jens Mertens
Verbindung nicht sonderlich gut zu sein: beim erstmaligen Verknüpfen kann
ich zwar lesend auf die Tabelle zugreifen, aber nun funktioniert es ab und
"ODBC-Verbindung zu 'Servername' fehlgeschlagen"
Da ich sehr häufig aus meiner Access-ANwendung auf die verknüpfte
MySQL-Tabelle zugreife, würde ich lieber auf Nummer Sicher gehen und statt
dem "Externe Daten"-->"Tabelle verknüpfen" lieber "..importieren"
verwenden.
zwar keine Antwort auf Deine Frage aber auch aufgrund Deines erstens
Postings "Probleme mit MyODBC" ist es vielleicht für Dich hilfreich, zu
sehen, wie man die Tabellenverknüpfungen per VBA herstellen kann (das was
Josef im ersten Posting als DSN less bezeichnet hat). Ich mache das in einem
'Alle Tabellen neu verlinken
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef
Dim strConnectTable As String
Dim strConnectQuery As String
Set dbs = CurrentDb
' Eingabefelder des Anmeldeformulars
Database = Me!Database
Servername = Me!Servername
username = Me!username
password = Me!password
' ODBC-Connectstrings zusammensetzen
strConnectTable = "DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" & Servername &
";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" & password &
";OPTION=259;"
strConnectQuery = "ODBC;DRIVER={MySQL ODBC 3.51 Driver};;SERVER=" &
Servername & ";DATABASE=" & Database & ";USER=" & username & ";PASSWORD=" &
password & ";OPTION=259;"
' Tabellen neu verlinken
For Each tdf In dbs.TableDefs
If Left$(tdf.Connect, 4) = "ODBC" Then
tdf.Connect = strConnectTable
' = Connection-String inkl. User und PWD
tdf.RefreshLink
End If
Next tdf
' Abfragen neu verlinken
For Each qdf In dbs.QueryDefs
If qdf.Connect > "" Then
qdf.Connect = strConnectQuery
End If
Next qdf
' Anmeldeform schließen und Hauptform öffnen
DoCmd.OpenForm "frmMainform"
DoCmd.Close acForm, "frmStart"
End Sub
Du müßtest also zunächst einen DSN-Eintrag erstellen (die genauen
http://www.connectionstrings.com/) und die Tabellen im Backend "zu Fuß"
verlinken - also über Datei -> Externe Daten -> Tabellen.
Hierdurch speichert Access den Verbindungsstring mit dem DSN-Eintrag in der
Systemtabelle MSysObjects ab. Danach verknüpfst Du die Tabellen mittels des
o.g. Codes nochmal. Access ändert daraufhin im Verbindungsstring den Eintrag
von DSN zu ODBC. Danach kannst Du auf den DSN-Eintrag verzichten.
Bei jedem Hinzufügen einer neuen Tabelle im Backend mußt Du dann allerdings
diese neue Tabelle erstmal wieder zu Fuß verlinken, um dann wieder mittels
des o.g. Codes den String zu ändern (aber auch das läßt sich mit Sicherheit
anders machen, obgleich ich jetzt nicht sagen kann, wie).
Gruß
Gernot
Josef Poetzl
2005-12-15 19:58:25 UTC
Permalink
Hallo!
Post by Jens Mertens
OK, ich bin schon wieder ein Stück weiter, kann mir jemand verraten, wie ich
in VBA ein mySQL-Passwort im Connection-String übergebe, wenn das Passwort
selber ein Semikolon enthält?
conn.Open ("DRIVER={MySQL ODBC 3.51 Driver};" & _
"Server=servername.com;" & _
"Port=3306;" & _
"Option=16384;" & _
"Stmt=;" & _
"Database=otrs;" & _
"Uid=kostenstelle;" & _
"Pwd=ko;84hG")
Ich befürchte, dass mein Fehler (Access denied for user... s.u.) daran
liegt.
Ja, daran liegt es. Ich konnte es reproduzieren.
Post by Jens Mertens
Kann das sein und wenn ja, wie kann ich das umgehen?
Problem: Wie will MyODBC das Passwort vorgelegt bekommen?
(Möglicherweise kann hier eine MySQL-NG helfen.)

Beim MSSQL-Server funktioniert:
ODBC: ... UID=user;PWD={asdf;fdsa};
OLEDB:... User ID=user;Password="asdf;fdsa";

Das funktioniert aber bei MySQL nicht.
Wie findet man nun heraus, wie bei einem MySQL-Benutzer-DSN das
Passwort übergeben wird? (Denn mit einem Benutzer-DSN funktioniert der
Zugriff, solange man das Passwort nicht in Access speichert)

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Peter Rambauske
2005-12-15 20:50:27 UTC
Permalink
Hallo Jens!

Ich verwende folgenden Code, um zum MySQL-Server zu verbinden:

Set conPrDb = New ADODB.Connection
With conPrDb
.CursorLocation = adUseClient
' für MySql zwingend notwendig.
' Mit adUseServer funktionieren nicht alle ' ADO-Features.
.Provider = "MSDASQL.1"
'"Microsoft OLE DB Provider for ODBC Drivers"
.ConnectionString = "DSN=xyz;"
.CommandTimeout = 90
.Open , varUserName, varPassWord
End With


Ich verwende den "MySQL ODBC 3.51" ODBC-Treiber.

Gruß aus Wien

Peter
Josef Poetzl
2005-12-15 21:08:55 UTC
Permalink
Hallo!
Post by Peter Rambauske
Set conPrDb = New ADODB.Connection
With conPrDb
.CursorLocation = adUseClient
' für MySql zwingend notwendig.
' Mit adUseServer funktionieren nicht alle
' ADO-Features.
.Provider = "MSDASQL.1"
'"Microsoft OLE DB Provider for ODBC Drivers"
.ConnectionString = "DSN=xyz;"
.CommandTimeout = 90
.Open , varUserName, varPassWord
End With
Ich verwende den "MySQL ODBC 3.51" ODBC-Treiber.
Funktioniert bei Dir damit ein Passwort wie "asdf;fdsa"?
Bei mir nämlich nicht. Ich verwende MySQL ODBC 3.51.12.

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Peter Rambauske
2005-12-15 22:30:26 UTC
Permalink
Post by Josef Poetzl
Hallo!
Post by Peter Rambauske
Set conPrDb = New ADODB.Connection
With conPrDb
.CursorLocation = adUseClient
' für MySql zwingend notwendig.
' Mit adUseServer funktionieren nicht alle
' ADO-Features.
.Provider = "MSDASQL.1"
'"Microsoft OLE DB Provider for ODBC Drivers"
.ConnectionString = "DSN=xyz;"
.CommandTimeout = 90
.Open , varUserName, varPassWord
End With
Ich verwende den "MySQL ODBC 3.51" ODBC-Treiber.
Funktioniert bei Dir damit ein Passwort wie "asdf;fdsa"?
Bei mir nämlich nicht. Ich verwende MySQL ODBC 3.51.12.
mfg
Josef
Nein, funktioniert auch nicht.

Es kommt folgende Fehlermeldung:

"[Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht
gefunden, und es wurde kein Standardtreiber angegeben"

Ich glaube einmal gelesen zu haben, daß ADO aus diesen Angaben
einen kompletten Connection-String erstellt und diesen an den
ODBC-Treiber übergibt. Dieser versteht ihn aber durch den
falsch gesetzten Strichpunkt aber nicht, da einige wichtige
Teile dann fehlen.

Gruß aus Wien

Peter
Jens Mertens
2005-12-16 09:25:41 UTC
Permalink
Hi All,

danke für die vielen Rückmeldungen. Ich hab nun das Passwort vom Admin
ändern lassen, grmpf. Immerhin kann ich nun fehlerfrei auf die MySQL-Tabelle
connecten.

Gruss, Jens
Post by Peter Rambauske
Post by Josef Poetzl
Hallo!
Post by Peter Rambauske
Set conPrDb = New ADODB.Connection
With conPrDb
.CursorLocation = adUseClient
' für MySql zwingend notwendig.
' Mit adUseServer funktionieren nicht alle ' ADO-Features.
.Provider = "MSDASQL.1"
'"Microsoft OLE DB Provider for ODBC Drivers"
.ConnectionString = "DSN=xyz;"
.CommandTimeout = 90
.Open , varUserName, varPassWord
End With
Ich verwende den "MySQL ODBC 3.51" ODBC-Treiber.
Funktioniert bei Dir damit ein Passwort wie "asdf;fdsa"?
Bei mir nämlich nicht. Ich verwende MySQL ODBC 3.51.12.
mfg
Josef
Nein, funktioniert auch nicht.
"[Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht
gefunden, und es wurde kein Standardtreiber angegeben"
Ich glaube einmal gelesen zu haben, daß ADO aus diesen Angaben
einen kompletten Connection-String erstellt und diesen an den
ODBC-Treiber übergibt. Dieser versteht ihn aber durch den
falsch gesetzten Strichpunkt aber nicht, da einige wichtige
Teile dann fehlen.
Gruß aus Wien
Peter
Loading...