Datensätze bei Aktualisierungsabfragen begrenzen

21/07/2009 - 12:13 von Andreas Vogt | Report spam
Hallo NG,
mit Aktualisierungsabfragen habe ich immer ein wenig Bauchschmerzen -
einmal die Kriterien vergessen oder falsch implementiert und schon
werden Daten geàndert die ich nicht möchte. Ist mir leider auch 1 bis
2 mal schon vorgekommen. Die Lösung wàre ein "Limit 1", wie z.B. von
MySQL her bekannt - aber wie auch bekannt ist gibts das bei Access
nicht.

Also überlege ich ob ich nicht meine Aktualisierungsabfragen in einer
Methode kapseln solle, die das für mich prüft. Herausgekommen ist
nachfolgender erster Testcode, noch ohne Errorhandler:

Public Function UpdateDB(strTableName As String, strZuweisungsliste As
String, strCriteria As String, Optional lngLimit As Long = 0) As
Boolean
Dim strTestSQL As String
Dim dbUDB As DAO.Database
Dim rsUDB As DAO.Recordset

strTestSQL = "Select * From " & strTableName & " Where " &
strCriteria
Set dbUDB = CurrentDb
Set rsUDB = dbUDB.OpenRecordset(strTestSQL, dbOpenDynaset)

If rsUDB.EOF Then
MsgBox "Es wurde kein Datensatz aktualisiert!"
GoTo Aufraeumen
End If

If lngLimit > 0 Then
rsUDB.MoveLast
If rsUDB.RecordCount > lngLimit Then
MsgBox "Die Abfrage würde zuviele Datensàtze
aktualisieren" & vbCrLf & "Die Datenoperation wurde abgebrochen"
GoTo Aufraeumen
End If
End If

dbUDB.Execute "Update " & strTableName & " Set " &
strZuweisungsliste & " Where " & strCriteria
If dbUDB.RecordsAffected = 0 Then
MsgBox "Es wurde kein Datensatz aktualisiert!"
GoTo Aufraeumen
End If

UpdateDB = True

Aufraeumen:
rsUDB.Close
Set rsUDB = Nothing
Set dbUDB = Nothing
End Function


Sub Test()
If UpdateDB("Tabelle1", "archiv = False", "Wert = 'C'", 1) Then
MsgBox "Daten wurden geàndert"
End If
End Sub

Was meint ihr dazu? Ist sowas eine praktikable und sichere Lösung?
Gruß Andreas
 

Lesen sie die antworten

#1 Josef Poetzl
21/07/2009 - 12:33 | Warnen spam
Hallo!

Andreas Vogt schrieb:
[...]
Also überlege ich ob ich nicht meine Aktualisierungsabfragen in einer
Methode kapseln solle, die das für mich prüft. Herausgekommen ist
nachfolgender erster Testcode, noch ohne Errorhandler:


[...]
If lngLimit > 0 Then
rsUDB.MoveLast
If rsUDB.RecordCount > lngLimit Then
MsgBox "Die Abfrage würde zuviele Datensàtze
aktualisieren" & vbCrLf & "Die Datenoperation wurde abgebrochen"
GoTo Aufraeumen
End If
End If




Du könntest auch eine Transaktion dafür verwenden.
Dann ersparst du dir die Select-Anweisung.

Prinzip (Luftcode):
DBEngine.BeginTrans
dbUDB.execute "update ..."
if lngLimit > 0 and lngLimit < dbUDB.RecordsAffected then
DBEngine.Rollback
...
else
DBEngine.CommitTrans
end if
...

Anm.: bei aktiven DBMS würde ich das in eine gespeicherte Prozedur
auslagern und nur die DBMS-Prozedur starten.


mfg
Josef

EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen