Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: imp666 am März 22, 2011, 16:20:03

Titel: SQL-Query-String direkt an Backend senden
Beitrag von: imp666 am März 22, 2011, 16:20:03
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.
Titel: Re: SQL-Query-String direkt an Backend senden
Beitrag von: Hondo am März 23, 2011, 06:45:20
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
Titel: Re: SQL-Query-String direkt an Backend senden
Beitrag von: imp666 am März 24, 2011, 08:33:41
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)
Titel: Re: SQL-Query-String direkt an Backend senden
Beitrag von: Hondo am März 24, 2011, 08:51:17
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
Titel: Re: SQL-Query-String direkt an Backend senden
Beitrag von: imp666 am März 24, 2011, 09:09:29
Jepp, das sieht gut aus... werde ich zeitnah testen. Danke.

Vielleicht kann man durch so eine Connection auch SQL senden... ich werde mal googlen.
Titel: Re: SQL-Query-String direkt an Backend senden
Beitrag von: Hondo am März 24, 2011, 09:33:48
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
Titel: Re: SQL-Query-String direkt an Backend senden
Beitrag von: imp666 am März 24, 2011, 10:46:14
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.
Titel: Re: SQL-Query-String direkt an Backend senden
Beitrag von: Hondo am März 24, 2011, 11:18:31
Was spricht da dagegen? das geht doch auch mit gespeicherten Prozeduren:
http://fernandoipar.com/2009/04/29/soundex-triggers-and-stored-procedures/

Andreas