Gemeinsam zu mehr Effizienz in der Anwendungserstellung
K (Die Seite wurde neu angelegt: „ {{Hierarchy header}} {{Info|text= Der unten angeführte Code zeigt nur ein Prinzip und stellt keine fertige Lösung dar. }} === Ausgangsbasis === === Eingesetz…“) |
K (→Variante für gespeicherter Abfrage) |
||
(Der Versionsvergleich bezieht 23 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 Insert- oder Update-Anweisung soll per VBA zusammengesetzt und mit Werten aus Variablen versorgt werden. | ||
+ | |||
+ | === Eingesetzte Elemente === | ||
+ | * DAO.QueryDef | ||
+ | |||
+ | === Konzept === | ||
+ | |||
+ | # QueryDef-Objekt erstellen | ||
+ | # Parameterwerte festlegen | ||
+ | # SQL-Anweisung ausführen | ||
+ | |||
+ | === Umsetzung === | ||
+ | <source> | ||
+ | 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 | ||
+ | </source> | ||
+ | |||
+ | ==== Verwendung ==== | ||
+ | <source> | ||
+ | anzahlDS = ExecuteParamSQL("Parameters P1 Text(255), P2 int, P3 date; " & _ | ||
+ | "insert into Tabelle (T, Z, D) Values ([P1], [P2], [P3])", _ | ||
+ | "abc", 123, Now()) | ||
+ | </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())