Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Automatische Verknüpfung einer MySQL-Tabelle

56 views
Skip to first unread message

Jens Mertens

unread,
Dec 14, 2005, 12:35:08 PM12/14/05
to
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

unread,
Dec 14, 2005, 2:25:03 PM12/14/05
to
Jens Mertens <james....@gmx.de> schrieb:

> 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

unread,
Dec 15, 2005, 3:26:24 AM12/15/05
to
Hi Phil,

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

gruss, jens

"Philipp Stiefel" <ph...@codekabinett.de> schrieb im Newsbeitrag
news:dnpuaa...@pluto.ksw.codekabinett.com...

Gernot Adams

unread,
Dec 15, 2005, 3:52:45 AM12/15/05
to
hi,

"Jens Mertens" <james....@gmx.de> schrieb im Newsbeitrag
news:OH6bqSNA...@TK2MSFTNGP12.phx.gbl...


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

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

unread,
Dec 15, 2005, 4:35:46 AM12/15/05
to
Hallo!

Gernot Adams schrieb:


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

[...]


> 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

unread,
Dec 15, 2005, 10:06:30 AM12/15/05
to
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

"Gernot Adams" <gernot...@imformgroup.com> schrieb im Newsbeitrag
news:em7AvTV...@TK2MSFTNGP12.phx.gbl...

Jens Mertens

unread,
Dec 15, 2005, 10:39:58 AM12/15/05
to
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


"Jens Mertens" <james....@gmx.de> schrieb im Newsbeitrag

news:%235T$QkYAG...@TK2MSFTNGP12.phx.gbl...

Jens Mertens

unread,
Dec 15, 2005, 11:51:23 AM12/15/05
to
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

"Jens Mertens" <james....@gmx.de> schrieb im Newsbeitrag

news:egyd92YA...@TK2MSFTNGP12.phx.gbl...

Jens Mertens

unread,
Dec 15, 2005, 12:00:50 PM12/15/05
to
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

"Jens Mertens" <james....@gmx.de> schrieb im Newsbeitrag

news:%23tTu3eZ...@TK2MSFTNGP15.phx.gbl...

Josef Poetzl

unread,
Dec 15, 2005, 2:58:25 PM12/15/05
to
Hallo!

Jens Mertens schrieb:


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

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

Peter Rambauske

unread,
Dec 15, 2005, 3:50:27 PM12/15/05
to
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

unread,
Dec 15, 2005, 4:08:55 PM12/15/05
to
Hallo!

Peter Rambauske schrieb:

Funktioniert bei Dir damit ein Passwort wie "asdf;fdsa"?
Bei mir nämlich nicht. Ich verwende MySQL ODBC 3.51.12.

Peter Rambauske

unread,
Dec 15, 2005, 5:30:26 PM12/15/05
to
Josef Poetzl schrieb:

> Hallo!
>
> Peter Rambauske schrieb:
>
>>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.
>
>
> 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

unread,
Dec 16, 2005, 4:25:41 AM12/16/05
to
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

"Peter Rambauske" <peter.r...@utanet.at> schrieb im Newsbeitrag
news:e9%231wdcA...@TK2MSFTNGP10.phx.gbl...

0 new messages