Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

SQL-Query-String direkt an Backend senden

Begonnen von imp666, März 22, 2011, 16:20:03

⏪ vorheriges - nächstes ⏩

imp666

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.

Hondo

Hallo,
MySQL sollte seit der Version 4 gespeicherte Prozeduren verarbeiten können.
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

imp666

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)

Hondo

#3
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

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

imp666

Jepp, das sieht gut aus... werde ich zeitnah testen. Danke.

Vielleicht kann man durch so eine Connection auch SQL senden... ich werde mal googlen.

Hondo

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

imp666

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.

Hondo