manuel5
Goto Top

Zugriff mit VBA über ODBC auf mysql-DB

Hallo zusammen,

also ich hab ne VBA-Form - EXCEL - bisher habe ich auf Daten zugegriffen die in den Excel-Tabellen lagen.
Nun habe ich die Daten in eine mySql-DB ausgelagert face-wink
Ich moechte nun per VBA mit ODBC auf die Sql-DB zugreifen und da dann per Abfragen Daten holen und mir in der Form - in Textfeld und auch in ComboBoxen etc dementsprechend die Daten anzeigen lassen.

So - also die Form steht - der ODBC steht und die MySql-DB steht auch

Wie geh ich un weiter vor?

Ich habs mals so versucht-->

Private Sub CommandButton5_Click()
Dim Conn, RS
Dim strSender As String
Dim strCompName1 As String
Dim intSQL As Integer


Set Conn = CreateObject("ADODB.Connection")
Conn.Provider = "MSDASQL"
Conn.Mode = adModeRead
Conn.CursorLocation = adUseClient
Conn.Open "DRIVER={MySQL ODBC 3.51 Driver};" & _
"DATABASE=XXXXXXXXX;" & _
"SERVER=localhost;", _
"xxxx;", _
"xxxx;"

Set RS = CreateObject("ADODB.Recordset")
RS.CursorLocation = adUseClient
RS.Source = "SELECT * FROM sender ORDER BY sender "
'oRS.Open "SELECT * FROM sender", oConn
'CompName1 = "Select * FROM sender WHERE CompName1 = 'XXXXXX;"

Set RS.ActiveConnection = Conn
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.Open
RS.Source = strSender
'strSender = RS.Source
'Set Conn = Nothing
MsgBox strSender

RS.Close
Set RS = Nothing

Conn.Close

End Sub


Ok - um ganz ehrlich zu sein - das klappt NULL! Ich habe auch lange Zeit deswegen gegoogelt - aba nichts gefunden

Grundsätzlich geht es mir darum -->

- Wie stelle ich eine Verbindung von VBA zu MySql-DB her (über ODBC)?
- Wie kann ich dann Daten aus der MySql-DB mir anzeigen lassen - Textbox und aber auch in ComboBoxen?
- Nett waere hier kein fertiges Script - eher so --> Schritt a) Recordset definieren- Schritt b) Datenbank verbinden Schritt c) Datenbank öffnen - Schritt d) und so weiter.

Also kein fertiges Script und so -ich wills ja gerne lernen face-wink)


Danke euch schon und bis dann

Gruss Manuel

Content-ID: 79206

Url: https://administrator.de/contentid/79206

Ausgedruckt am: 20.11.2024 um 13:11 Uhr

miniversum
miniversum 26.01.2008 um 15:28:38 Uhr
Goto Top
Schau mal ob Dir dashier hilft:
http://www.activevb.de/tutorials/tut_ado_db/adodb.html

miniversum
manuel5
manuel5 26.01.2008 um 17:41:07 Uhr
Goto Top
Hallo miniversum,

danke fuer den Tip! Genau sowas hab ich gesucht.
Die Verbindung taucht nun!
Jetzt muss ich nur noch die Daten holen und anzeigen - aber soweit schon mal super Danke

Gruss Manuel
manuel5
manuel5 26.01.2008 um 20:45:23 Uhr
Goto Top
Hallo

also ich habs nun mal so versucht -->

Sub Start()
UserForm5.Show

Cn.Provider = "SQLOLEDB.1"
Cn.ConnectionString = "Password=xxx;" & _
"Persist Security Info=True;" & _
"User ID=xxxx;" & _ (<-- Benutzer)
"Initial Catalog=XXXXXXXXXXX;" & _ (<---ist dies die Datenbank?)
"Data Source=XXXXXXX" (<-- und hier die Tabelle?)
End Sub


somit - denke ich - sollte sich beimStarten des Forms eine Verbindung zur Datenbank aufbaun - hoffe ich liege recht in meiner Annahme)


Ok - wie kann ich nun "checken" ob die Verbindung steht?

Habe mal nen Button gemacht der mir eine Tabelle in einer msgbox ausgeben soll - eben nur um zu checken - aba da passiert nuescht face-sad((


Private Sub CommandButton5_Click()
'Dim Rs As New ADODB.Recordset
Dim strSQL As String
strSQL = "SELECT * FROM XXXXXX LIMIT 100"

MsgBox strSQL
End Sub


Gruß Manuel
SvenGuenter
SvenGuenter 31.01.2008 um 16:47:11 Uhr
Goto Top
hi wenn du ein recodset füllen willst geht das ein wenig anders. Dein sqlstring enthält nur das select da weiß die datenbank noch nichts von. Hier mal ein Beispiel. Das findest du aber auch in jedem guten VB uch.


DB Connection
verbindung zur ODBC Schnittstelle
Set condb = New ADODB.connection
condb.Open "Provider=MSDASQL.1;DATA SOURCE=admintooldb"  

Dim rec as ADODB.RECORDSET

Set rec = New ADODB.Recordset

rec.CursorLocation = adUseClient

rec.Open "select * from T_BEFEHLE ORDER BY namebefehl ", condb, adOpenForwardOnly, adLockReadOnly  


while not rec.eof 

 msgbox(rec.fields(1))


WEND


Schließen der Verbindung
condb.Close
manuel5
manuel5 01.02.2008 um 14:38:04 Uhr
Goto Top
WAHNSINNNNNN!!!!!!!!!

Es löfft! Super DANKE!

Nur den Provider ausgetauscht und schon funtzt es!

Super!

Gruss Manuel
manuel5
manuel5 02.02.2008 um 09:24:50 Uhr
Goto Top
Hallo nochmal,

nun is es so das mir das ganze in eine Endlosschleife geht und ich nur über den Taskmanager dies abschiessen kann.

While Not rec.EOF
MsgBox (rec.Fields(2))
Wend

Eigentlich klar - aba wie kann ich das verhindern? Er soll ja nur die Select-Abfrage "finden" --> anzeigen --> und gut is!


Hätte Ihr da evetnl noch ne Idee wie ich das verhindern kann?

Gruß Manuel
SvenGuenter
SvenGuenter 02.02.2008 um 15:30:10 Uhr
Goto Top
japp hier musst du natürlich noch ein rec.movenext machen. sorry.


'Bleibe in der Schleife so lange das Recordset nicht EOF ( End of File ) erreicht hat  
While Not rec.EOF
'Ausgabe des 3 Feldes Des Recordsetsobjektes  
MsgBox (rec.Fields(2))

'Wenn Das dritte Feld gleich der Bedingung ist dann springe zu exit  
if rec.Fields(2) = Bedingung then goto exit

'Lese nächsten Datensatz aus dem Recordset  
rec.movenext
Wend
'Ausgangspunkt für den GoTo  
exit:

'Weiterer Quellcode  

lese das gerade. Du musst natürlich um das Recordset anzuzeigen nicht erst die Whileschleife durchlaufen.
Kannst auch direkt ein Datagrid oder ein MSHFlexgrid auf deine Form ziehen und dann diesem das Recordset als Datasorce zuweisen.

Als Beispiel
With Datagrid

.....Weitere Eigenschaften fürs Datagrid
.enable = true
.datasourde = rec


end with

oder einfach Datagrid.datasource = rec
manuel5
manuel5 02.02.2008 um 16:54:01 Uhr
Goto Top
Hallo,

ja - das schaut gut aus - bzw logisch
Aber was meinst du mit "Bedingung"? true oder false?

also wenn rec.Fields is true dann goto exit -->
wenn nicht rec.movenext solange bis die Bedingung erfuellt ist...

aber diesen "Ausgangspunkt für den GoTo versteh ich ned

exit: <-- und weiterer Quellqode? das versteh ich ned wirklich

Gruß Manuel
SvenGuenter
SvenGuenter 02.02.2008 um 18:00:17 Uhr
Goto Top
also nehmen wir an dein Datansatz in der DB sieht folgendermaßen aus

"Andrea" "Guenter" "15.10.1969" "weiblich"
"Sven" "Guenter" "22.07.1971" "maennlich"

diese liest du nun aus mit
'Bedingung für eine Anzeige ist das die alle haben willst die maennlich sind

WHILE NOT rec.EOF

IF rec.(Fields(3)) = maennlich then GoTo exit


rec.MoveNext
WEND
exit:
msgbox(rec(fields(3))

In diesem Beipiel
Wird sobald ein Datensatz gefunden wurde der maennlich enthält zum Punkt exit gesprungen und das Attribut maennlich wird ausgegeben.
Wenn du aber alles anzeigen lassen willst was das Recordset enthält solltest du dir ein DataGrid auf deine Form ziehen und diesem Datagrid dein Recordset als Datenquelle angeben und zwar folgendermaßen. ( Hier kannst du die Whileschleife weglassen )

DataGrid.Datasource = rec

Beim starten deines Programmes werden nun alle Datensätze die dein Recordset enthält im DataGrid angezeigt.
manuel5
manuel5 02.02.2008 um 18:57:43 Uhr
Goto Top
Hallo,

ich hab meine SELECT-Abfrage nun so gemacht -->
rec.Open "SELECT * from *tabelle* WHERE *feld* = '0_0' ", condb, adOpenForwardOnly, adLockReadOnly


So dann findet er mit die Zeile in der 0_0 steht und gibt mir davon das 3 Feld aus - hier is es der Name - aba das is ja egal....es klappt face-wink

Also - der DB Zugriff/Verbindung passt - Die Suche/Select passt auch
Mit dem Grid hab ich das ganze mal begonnen - das stimmt schon is auch ne gute Sache - aba ich will lieber auf die SQL drauf

Was mach ich aber nun wenn ich zum Beispiel in einer ComboBox alle Daten die in der Spalte Namen stehen dort mir ausgeben will?

Private Sub ComboBox6_Change

dim blablabla
...
...
ComboBox6.Value = (rec.Fields(2))


hmmm- das fehlt im ein Objekt.

Textbox6.Value funtzt ja auch....

Gruss Manuel
SvenGuenter
SvenGuenter 03.02.2008 um 23:19:30 Uhr
Goto Top
^^ also das erkläre ich dir morgen nun geh ich erstmal in die heia...


schau dir aml die additem methode an die macht das ;o)
manuel5
manuel5 04.02.2008 um 08:03:37 Uhr
Goto Top
face-wink
Klar - schlafen darfste auch mal! face-wink So bin ich ja garned.

Also mit dem additem hab ichs natuerlich zuallerganzerst versucht. Da meldet er mir
"Ein Objekt das dem angeforderten Namen oder dem Ordinalverweis entspricht, kann nicht gefunden werden"

?

Ich denk mal - das ich anstatt der Fields hier in etwa Rows oder Columns angeben muss.....denk ich!

Gruß Manuel
SvenGuenter
SvenGuenter 04.02.2008 um 08:28:30 Uhr
Goto Top
so ein neuer Tag und hier erstmal der schnippsel für dich.

'Recordset auf den ersten Datensatz setzen  
rec.MoveFirst

'Schleife durchlaufen bos ende der Datensätze erreicht ist  
While Not rec.EOF
'Datenfeld im Combofeld anzeigen  
Me.Combo1.AddItem (rec.Fields(1))
'Nächsten Datensatz lesen  
rec.MoveNext
Wend
SvenGuenter
SvenGuenter 04.02.2008 um 08:33:31 Uhr
Goto Top

Textbox6.Value funtzt ja auch....




Eine Frage am Rande. Reden wir von VB6 oder VB.net?

Meines Wissens nach unterstützt eine Textbox in VB6 kein .Value sondern nur .net ;o)

Gruß

Sven
manuel5
manuel5 04.02.2008 um 08:55:53 Uhr
Goto Top
Hallo,

nein nein nicht von .Net

aba auch nicht von VB6 - sondern von VBA... face-smile

Aba das sollte ja nicht das Problem ansich sein.


Set condb = New ADODB.Connection
condb.Open "DRIVER=MySQL ODBC 3.51 Driver; SERVER=localhost; DATABASE=meineDatenbank;USER=XXXX;PASSWORD=XXXX;"
Dim rec As ADODB.Recordset
Set rec = New ADODB.Recordset
rec.CursorLocation = adUseClient
rec.Open "SELECT * from tabelle WHERE blablabla = blablabla", condb, adOpenForwardOnly, adLockReadOnly
rec.MoveFirst
While Not rec.EOF

Me.ComboBox6.AddItem (rec.Fields(2))
If rec.Fields(2) = True Then
End If
rec.MoveNext
Wend
condb.Close


Hmmm - selbe Fehlermeldung wie oben...

Gruß Manuel
SvenGuenter
SvenGuenter 04.02.2008 um 10:26:29 Uhr
Goto Top
Und sicher das diese ComboBox acuh ComboBox6 heißt?
manuel5
manuel5 04.02.2008 um 10:31:04 Uhr
Goto Top
Absulut! face-smile
Habs nochmal gecheckt

Gruß Manuel
SvenGuenter
SvenGuenter 04.02.2008 um 10:39:12 Uhr
Goto Top
und dein recordset auch 3 felder hat?

Denk dran das das recordset bei 0 anfängt.

und zwar immer.

wenn dein Recordset irgendwann nur 2 Datenteile erhält bekommst du einen fehler weil er das Rec.Fields(2) nicht findet weil nicht vorhanden
manuel5
manuel5 04.02.2008 um 10:46:37 Uhr
Goto Top
Äh? Was meinst du damit? Mein Recordset also meine Tabelle?
Oder versteh ich dich jetzt total falsch?

Gruß Manuel
SvenGuenter
SvenGuenter 04.02.2008 um 11:00:22 Uhr
Goto Top
du machst ein select welches dein Recordset füllt.

rec.Open "SELECT * from *tabelle* WHERE *feld* = '0_0' ", condb, adOpenForwardOnly, adLockReadOnly  

frage ist nun ob dieses Recordset immer so aussieht

Wert1,Wert2,Wert3 das entspricht im Recordset Rec.Fields(0),Rec.Fields(1),Rec.Fields(2)

Sprich das dein Wert3 Immer gefüllt ist. Grund ist folgender wenn dein Recordset irgendwann auf einen Wert3 trifft der nicht gefüllt ist bekommtst du die Fehlermeldung da dein Rec.Fields(2) nothing ist und somit kein Objekt welches die ComboBox aber bracuht um was anzeigen zu können.
manuel5
manuel5 04.02.2008 um 11:07:22 Uhr
Goto Top
Jop - das hab ich grad geaendert Habe jetzt Fields (0) genommen da is alles voll

Jetzt wenn ich die Daten reinschieben will bringt er mir die Meldung "Nicht näher bezeichneter Fehler"

Kann es sein das es zuviele Daten sind?
Also er soll mir "nur" die Spalte 1 (bzw 0) in der Combobox anzeigen ......

Gruß Manuel
SvenGuenter
SvenGuenter 04.02.2008 um 13:00:26 Uhr
Goto Top
japp wenn du mehr als 2000 Zeichen hast ( also alle zeichen der Einträge ) dann macht VBA nicht mehr mit.

Muss das eine Combobox sein die du da benutzt?
manuel5
manuel5 04.02.2008 um 13:33:16 Uhr
Goto Top
Hmmm - da bin ich doch relativ offen
Es sollte ein Auswahl-Feld ......hmmm - also er soll mir hier die ganzen Firmennamen anzeigen - bzw - Ich möchte hier die Firma auswählen können.
Könnte also ne Textbox sein im Grunde - die mir dann die Select-Abfrage direkt macht

Also wenn das Textbox1 ist - dann nen Commandbutton daneben der dann sagt - Select CombName1 from *tabelle" where CombName1 = Textbox1

Könnte so so funtzen oder?

Dann halt textbox2 und textbox3 in denen ich die Daten einfuellen lassen
Praktisch - wenn der die Abrage erfolgreich getaetigt hat soll er mir CombName1 in Textbox2 und Strasse1 in Textbox3 einfuellen - also eingeben! face-smile

Und ne Chance mit Combobox hab ich garned?

Gruß Manuel
SvenGuenter
SvenGuenter 04.02.2008 um 13:54:05 Uhr
Goto Top
wenn du über 2000 zeichen kommst wohl nein.

Tut mir leid. Ich überlege mir mal was mit einer Listbos. Aber das fuellen geht genau so wie mit einem Comboboxfeld.


welche Excel Version nutzt du denn?

Gruß

Sven
manuel5
manuel5 04.02.2008 um 14:51:14 Uhr
Goto Top
Hmmmmmm - ok - ich versuchs auch...... irgendwie muss es gehen!

Danke und Gruß

Manuel
manuel5
manuel5 04.02.2008 um 19:12:32 Uhr
Goto Top
Hallo,

habs soweit hinbekommen - NUR!! face-smile zeigt er mir erst zig Zeilen leer an und faengt dann irgendwann mal aufzulisten - also genau die Felder die ich brauch
Das is seltsam - warum tut er m ir ned gleich von vornherein richtig die Daten wiedegeben?

Private Sub CommandButton5_Click()
Set condb = New ADODB.Connection
condb.Open "DRIVER=MySQL ODBC 3.51 Driver; SERVER=localhost; DATABASE=datenbank;USER=xxxx;PASSWORD=xxxx;"
Dim rec As ADODB.Recordset
Set rec = New ADODB.Recordset
rec.CursorLocation = adUseClient
rec.Open "SELECT * FROM `table`ORDER BY `feld1`.`feld2` ", condb, adOpenForwardOnly, adLockReadOnly

rec.MoveFirst
While Not rec.EOF
ComboBox6.AddItem (rec.Fields(3))
rec.MoveNext
Wend

condb.Close

End Sub
manuel5
manuel5 08.02.2008 um 10:46:27 Uhr
Goto Top
Hallo Sven,

soweit steht die "Datenbank-Excel-Form-Sache" nun!
Nur noch hier und da ne Kleinigkeit.

Danke dir für deine Geduld und deiner Hilfe!
Hast mich echt weitergebracht.
Danke dir!

Gruß Manuel