2009-06-25 7 views
1

Ich versuche, Batch-Updates in Access VBA zu verwenden. Mein Code funktioniert einwandfrei, wenn ich nach jeder Operation aktualisiere, scheitert aber, wenn ich versuche, mehrere Zeilen zu bearbeiten. Die Ausnahme, die ich bekommen istADO-Batch-Update in Access VBA

„Laufzeitfehler‚-2147217887 (80040e21)‘:... Aus mehreren Schritten bestehenden OLE DB-Vorgang Fehler erzeugt Prüfen Sie alles OLE DB-Statuswerte, falls verfügbar Keine Arbeit getan war“

Mein Code ist

rs.Open "dbrammDump", CurrentProject.Connection, _ 
      adOpenKeyset, adLockBatchOptimistic 
rowsDel = 0 
Do Until rs.RecordCount < 1 
    rs.MoveFirst 
    rs.Delete 

    rowsDel = rowsDel + 1 
Loop 
rs.UpdateBatch 

Irgendwelche Ideen, was das Problem ist?

Antwort

1

Ich denke, das Problem ist, dass Sie explizit einen clientseitigen Cursor verwenden müssen. Ich vermute, dass Sie implizit einen serverseitigen Cursor verwenden.

Ich bevorzuge es, die Eigenschaften des Re-Cord-Set-Objekts einzeln festzulegen, da ich denke, dass es einfacher zu lesen (und daher zu debuggen) als mit der überladenen Open-Methode ist. Sie können auch die Eigenschaft RecordCount für Ihre Schleife verwenden, z.

With rs 
    .ActiveConnection = CurrentProject.Connection 
    .Source = "dbrammDump" 
    .CursorLocation = adUseClient ' <<< THIS MISSING FROM ORIGINAL CODE 
    .CursorType = adOpenKeyset 
    .LockType = adLockBatchOptimistic 
    .Open 

    Dim counter As Long 
    For counter = 0 To .RecordCount - 1 
     .Delete 
     .MoveNext 
    Next 

    .UpdateBatch 

    rowsDel = counter 

End With 

FWIW Ich stimme hier mit anderen, dass eine Set-basierten Lösung in SQL zu prozeduralen Code vorzuziehen ist, wie das oben.

+0

Weißt du, ich denke nicht, dass das eine Stapelaktualisierung durchführen wird, wenn Sie das Recordset zuerst trennen. Nach '.Open' müssen Sie' Set .ActiveConnection = Nothing' eingeben, dann vor '.UpdateBatch'' Set .ActiveConnection = CurrentProject.Connection'. – ErikE

+0

Hmm ... Ich kann nicht scheinen, dass getrennte Recordsets soweit funktionieren. Also vielleicht war mein Kommentar verfrüht. – ErikE

+0

Aha! Ich habe 'adLockBatchOptimistic' nicht verwendet. 'adLockOptimistic' verhindert, dass Batch-Updates funktionieren. – ErikE

1

Warum löschen Sie Datensätze auf diese Weise, wenn Sie myconnection.Execute "DELETE FROM myTable WHERE....." anrufen könnten?

Wie haben Sie das Recordset geöffnet? Fügen Sie die myrecordset.Open(...) Anweisung hier ein.
Sehen Sie, ob dies link hilft.

+0

Stimmt, das wäre besser für diesen Fall (danke :-). Ich füge aber auch ein paar tausend Zeilen ein - und möchte das lieber stapelweise als einzeln machen. – jwoolard

+0

Ist die Quelle Ihrer Einfügungen ein Datensatz, der in einer SELECT-Anweisung als Stapel angehängt werden kann? Wenn ja, das ist deine Antwort. –

1

Ist die Quelle Ihrer Einfügungen ein Datensatz, der in einer SELECT-Anweisung als Stapel angehängt werden kann? Wenn ja, das ist deine Antwort.

Wenn Sie die Anzahl der gelöschten/eingefügten/mit ADO-Code aktualisierten Zeilen benötigen, verwenden Sie Folgendes.