Wiki der Access Code Library

Gemeinsam zu mehr Effizienz in der Anwendungserstellung

Insert oder Update als Parameter-Abfrage

Aus Access Code Library
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
K (Umsetzung)
K (Variante für gespeicherter Abfrage)
 
(Der Versionsvergleich bezieht 15 dazwischenliegende Versionen mit ein.)
Zeile 1: Zeile 1:
-
__NOTOC__
+
[[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__
-
=== Ausgangsbasis ===
+
=== Ausgangssituation ===
Eine Insert- oder Update-Anweisung soll per VBA zusammengesetzt und mit Werten aus Variablen versorgt werden.
Eine Insert- oder Update-Anweisung soll per VBA zusammengesetzt und mit Werten aus Variablen versorgt werden.
Zeile 38: Zeile 38:
==== Verwendung ====
==== Verwendung ====
<source>
<source>
-
anzahlDS = ExecuteParamSQL("Parameters P1 text, P2 int, P3 date; " & _
+
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}}

Aktuelle Version vom 09:31, 6. Jan. 2020


Programmier-Konzepte

Inhalt

Der unten angeführte Code zeigt nur ein Prinzip und stellt keine fertige Lösung dar.

Ausgangssituation

Eine Insert- oder Update-Anweisung soll per VBA zusammengesetzt und mit Werten aus Variablen versorgt werden.

Eingesetzte Elemente

  • DAO.QueryDef

Konzept

  1. QueryDef-Objekt erstellen
  2. Parameterwerte festlegen
  3. SQL-Anweisung ausführen

Umsetzung

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

Verwendung

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.

Variante für gespeicherter Abfrage

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

Verwendung

SQL der gespeicherten Abfrage:
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())


Arr_l.png SQL-Anweisungen | Benutzerverwaltung und Login Arr_r.png