Kann ich einen in VBA zusammengesetzten SQL-String direkt an das Backend (mySQL) übermitteln, ohne dass Access es auswertet?
Ich meine so etwas was DoCmd.RunSQL macht, jedoch serverseitig. mySQL würde den String direkt ohne Probleme auswerten, das habe ich bereits getestet, aber dort kommt der nie in der Form an.
Ich habe mehrere SQL-Anweisungen in einem String stehen (";"-separiert, gemäß SQL-Syntax). RunSQL wertet aber immer nur die erste SQL-Anweisung aus.
Den SQL-String zu splitten scheint mir auch nicht sinnvoll, da die Laufzeit von RunSQL grottig ist.
Hallo,
MySQL sollte seit der Version 4 gespeicherte Prozeduren verarbeiten können.
http://dev.mysql.com/doc/refman/5.1/de/stored-procedures.html (http://dev.mysql.com/doc/refman/5.1/de/stored-procedures.html)
Wäre das nicht eine Lösung? Vorallem da dabei eine sehr gute Performance zu erwarten ist.
Gruß Andreas
Das klingt schon mal gut, wie rufe ich denn so eine gespeicherte Funktion oder Routine in Access auf?
(Das mySQL liegt auf dem Linux-Server und Access läuft auf Workstations)
Hallo,
für MySQL weiss ich es nicht genau da ich es bei Gesp. Prozeduren noch nie verwendet habe. Beim MS SQL Server mach ich das so.
Ich erstell ein eigenes Modul für den Aufruf der Stored Procedures.
Eine Prozedur die Parameter und Rückgabewert besitzt sieht bei mir dann so aus.
Die Prozedur mit einem Select Case ersetzt mir 4 einzelne Stored Procedures, also nicht wundern.
ConnectionString für MySQL musst du natürlich anpassen, siehe www.connectionstrings.net (http://www.connectionstrings.net)
Public Function getKomponentenID(idWert As String, Komponente As String) As Long
Dim tblname As String
Dim field As String
Dim strProcname As String
10 On Error GoTo getKomponentenID_Error
20 strProcname = "dbo.getKomponentenID"
30 ConnectionString = "Driver={SQL Server};Server=Servername;Uid=;Pwd=;"
40 Set cnn = OpenConnection(ConnectionString)
50 Set cmdObj = New ADODB.Command
60 With cmdObj
70 .ActiveConnection = cnn
80 .CommandText = strProcname
90 .CommandType = adCmdStoredProc
100 .CommandTimeout = 60
110 .Parameters.Refresh
120 Select Case LCase(Komponente)
Case "geh":
130 tblname = "tbl_X1_Daten"
140 field = "Gehaeusenr"
150 Case "steu":
160 tblname = "tbl_X2_Daten"
170 field = "ID_STEU"
180 Case "ven":
190 tblname = "tbl_X3_Daten"
200 field = "ID_VEN"
210 Case "due":
220 tblname = "tbl_X4_Daten"
230 field = "ID_DUE"
240 Case Else
250 Exit Function
260 End Select
270 .Parameters("@tblname") = tblname
280 .Parameters("@field") = field
290 .Parameters("@ident") = idWert
300 .Parameters("@ID") = Null
310 .Execute
320 getKomponentenID = .Parameters("@ID").Value
330 End With
Exit_getKomponentenID:
340 Set cmdObj = Nothing
350 Set cnn = Nothing
360 On Error GoTo 0
370 Exit Function
getKomponentenID_Error:
380 MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure getKomponentenID of Modul mdl_StoredProcedures"
390 Resume Exit_getKomponentenID
End Function
Gruß Andreas
PS: wie du siehst braucht man den Verweiss Micrsoft ActiveX Data Objects 2.1
Jepp, das sieht gut aus... werde ich zeitnah testen. Danke.
Vielleicht kann man durch so eine Connection auch SQL senden... ich werde mal googlen.
Hallo,
nein, lass das lieber, das wird nicht gehen.
Die Abfrage (bzw. die gespeicherte Prozedur) befindet sich doch bereits auf dem Server. Dort wird sie per Create... angelegt oder per Alter... geändert. Access ruft diese auf und übergibt Parameter und eventuell empfängt Rückgabeparameter. D.H. die Abfrage selbst wird gar nicht übertragen, sondern nur der Aufruf.
Andreas
mySQL stellt aber z.B. Funktionen zur Verfügung, die ich im Access-Frontend gerne nutzen würde, wie z.B. "ENCODE"/"DECODE" oder "SOUNDEX". Daher wäre es mir am liebsten, wenn ich den SQL-String irgendwie direkt an den Server übermitteln könnte, ohne dass das weitaus schlechtere SQL-Interface von Access dazwischen langt.
Ich habe bisher Soundex als VBA-Routine implementiert, aber mySQL ist bei dieser Funktion um ein vielfaches schneller als das klobige VBA.
Und da ich auf ein neues Backend mit mySQL umgestiegen bin, möchte ich natürlich von derartigen Vorteilen profitieren.
Was spricht da dagegen? das geht doch auch mit gespeicherten Prozeduren:
http://fernandoipar.com/2009/04/29/soundex-triggers-and-stored-procedures/
Andreas