Gemeinsam zu mehr Effizienz in der Anwendungserstellung
| K  (→Verwendung) | K  (→Variante für gespeicherter Abfrage) | ||
| (Der Versionsvergleich bezieht 21 dazwischenliegende Versionen mit ein.) | |||
| Zeile 1: | Zeile 1: | ||
| + | [[Kategorie:Code-Schnipsel]] | ||
| {{Hierarchy header}} | {{Hierarchy header}} | ||
| {{Info|text= | {{Info|text= | ||
| Der unten angeführte Code zeigt nur ein Prinzip und stellt keine fertige Lösung dar. | Der unten angeführte Code zeigt nur ein Prinzip und stellt keine fertige Lösung dar. | ||
| - | }} | + | }}__NOTOC__ | 
| - | ===  | + | === Ausgangssituation === | 
| - | Eine  | + | Eine Insert- oder Update-Anweisung soll per VBA zusammengesetzt und mit Werten aus Variablen versorgt werden. | 
| === Eingesetzte Elemente === | === Eingesetzte Elemente === | ||
| - | * DAO | + | * DAO.QueryDef | 
| - | + | ||
| === Konzept === | === Konzept === | ||
| Zeile 16: | Zeile 16: | ||
| # SQL-Anweisung ausführen | # SQL-Anweisung ausführen | ||
| + | === Umsetzung === | ||
| <source> | <source> | ||
| Public Function ExecuteParamSQL(ByVal SqlText As String, _ | Public Function ExecuteParamSQL(ByVal SqlText As String, _ | ||
| - |                             ParamArray  | + |                             ParamArray QueryParams() As Variant) As Long | 
|     Dim qdf As DAO.QueryDef |     Dim qdf As DAO.QueryDef | ||
| Zeile 25: | Zeile 26: | ||
|     Dim i As Long |     Dim i As Long | ||
| - |     For i = 0 To UBound( | + |     For i = 0 To UBound(QueryParams) | 
| - |        qdf.Parameters(i) =  | + |        qdf.Parameters(i) = QueryParams(i) | 
|     Next |     Next | ||
|     qdf.Execute dbFailOnError |     qdf.Execute dbFailOnError | ||
| - | |||
|     ExecuteParamSQL = qdf.RecordsAffected |     ExecuteParamSQL = qdf.RecordsAffected | ||
| + |    qdf.Close | ||
| End Function | End Function | ||
| Zeile 37: | Zeile 38: | ||
| ==== Verwendung ==== | ==== Verwendung ==== | ||
| <source> | <source> | ||
| - | anzahlDS = ExecuteParamSQL("Parameters P1  | + | anzahlDS = ExecuteParamSQL("Parameters P1 Text(255), P2 int, P3 date; " & _ | 
|                             "insert into Tabelle (T, Z, D) Values ([P1], [P2], [P3])", _ |                             "insert into Tabelle (T, Z, D) Values ([P1], [P2], [P3])", _ | ||
|                             "abc", 123, Now()) |                             "abc", 123, Now()) | ||
| </source> | </source> | ||
| + | |||
| + | {{note|text= | ||
| + | Bei Memofeldern kann es unter Jet/ACE zu Problemen kommen, wenn der Parameter-Text länger als 255 Zeichen ist. | ||
| + | Um dieses Problem zu umgehen, könnte statt DAO.QueryDef die ADODB-Variante mit ADODB.Command verwendet werden. | ||
| + | }} | ||
| + | |||
| + | === Variante für gespeicherter Abfrage === | ||
| + | <source> | ||
| + | Public Function ExecuteParamQdf(ByVal QueryDefName As String, _ | ||
| + |                            ParamArray QueryParams() As Variant) As Long | ||
| + | |||
| + |    Dim qdf As DAO.QueryDef | ||
| + | |||
| + |    Set qdf = CurrentDb.QueryDefs(QueryDefName) | ||
| + | |||
| + |    Dim i As Long | ||
| + |    For i = 0 To UBound(QueryParams)-1 Step 2 | ||
| + |       qdf.Parameters(QueryParams(i)) = QueryParams(i + 1) | ||
| + |    Next | ||
| + |    qdf.Execute dbFailOnError | ||
| + |    ExecuteParamQdf = qdf.RecordsAffected | ||
| + |    qdf.Close | ||
| + | |||
| + | End Function | ||
| + | </source> | ||
| + | |||
| + | ==== Verwendung ==== | ||
| + | SQL der gespeicherten Abfrage: <source lang="sql">Parameters P1 Text(255), P2 int, P3 date;  | ||
| + | insert into Tabelle (T, Z, D) Values ([P1], [P2], [P3])</source> | ||
| + | |||
| + | Verwendung mit Hilfsprozedur: | ||
| + | <source> | ||
| + | anzahlDS = ExecuteParamQdf("GespeicherteAbfrage", _ | ||
| + |                            "P1", "abc", _ | ||
| + |                            "P2", 123, _ | ||
| + |                            "P3", Now()) | ||
| + | </source> | ||
| + | |||
| {{Hierarchy footer}} | {{Hierarchy footer}} | ||
| Programmier-Konzepte | 
| 
 | 
Der unten angeführte Code zeigt nur ein Prinzip und stellt keine fertige Lösung dar.
Eine Insert- oder Update-Anweisung soll per VBA zusammengesetzt und mit Werten aus Variablen versorgt werden.
Public Function ExecuteParamSQL(ByVal SqlText As String, _ ParamArray QueryParams() As Variant) As Long Dim qdf As DAO.QueryDef Set qdf = CurrentDb.CreateQueryDef("", SqlText) Dim i As Long For i = 0 To UBound(QueryParams) qdf.Parameters(i) = QueryParams(i) Next qdf.Execute dbFailOnError ExecuteParamSQL = qdf.RecordsAffected qdf.Close End Function
anzahlDS = ExecuteParamSQL("Parameters P1 Text(255), P2 int, P3 date; " & _ "insert into Tabelle (T, Z, D) Values ([P1], [P2], [P3])", _ "abc", 123, Now())
Bei Memofeldern kann es unter Jet/ACE zu Problemen kommen, wenn der Parameter-Text länger als 255 Zeichen ist. Um dieses Problem zu umgehen, könnte statt DAO.QueryDef die ADODB-Variante mit ADODB.Command verwendet werden.
Public Function ExecuteParamQdf(ByVal QueryDefName As String, _ ParamArray QueryParams() As Variant) As Long Dim qdf As DAO.QueryDef Set qdf = CurrentDb.QueryDefs(QueryDefName) Dim i As Long For i = 0 To UBound(QueryParams)-1 Step 2 qdf.Parameters(QueryParams(i)) = QueryParams(i + 1) Next qdf.Execute dbFailOnError ExecuteParamQdf = qdf.RecordsAffected qdf.Close End Function
Parameters P1 Text(255), P2 int, P3 date; INSERT INTO Tabelle (T, Z, D) VALUES ([P1], [P2], [P3])
Verwendung mit Hilfsprozedur:
anzahlDS = ExecuteParamQdf("GespeicherteAbfrage", _ "P1", "abc", _ "P2", 123, _ "P3", Now())