Freigeben über


Recordset: Weitere Informationen zu Aktualisierungen (ODBC)

Dieses Thema bezieht sich auf die MFC-ODBC-Klassen.

In diesem Thema wird Folgendes erläutert:

Hinweis

Dieses Thema bezieht sich auf von CRecordset abgeleitete Objekte, in denen das gesammelte Abrufen von Zeilen nicht implementiert wurde. Wenn Sie das Abrufen von Zeilen im Bulk implementiert haben, gelten einige Informationen nicht mehr. Beispielsweise können Sie die Mitgliedsfunktionen AddNew, Edit, Delete und Update nicht aufrufen; Sie können jedoch Transaktionen ausführen. Weitere Informationen zum massiven Abrufen von Zeilen finden Sie unter Recordset: Fetching Records in Bulk (ODBC).

Wie andere Vorgänge Updates beeinflussen

Ihre Aktualisierungen werden von Transaktionen beeinflusst, die zum Zeitpunkt der Aktualisierung wirksam sind, sowie dadurch, dass das Recordset vor Abschluss einer Transaktion geschlossen oder vor Abschluss einer Transaktion gescrollt wird.

Auswirkungen von Transaktionen auf Updates

Es ist wichtig, nicht nur zu verstehen, wie AddNew, Edit und Delete funktionieren, sondern auch, wie die Member-Funktionen BeginTrans, CommitTrans und Rollback von CDatabase mit den Updatefunktionen von CRecordset interagieren.

Standardmäßig wirken sich Aufrufe von AddNew und Edit sofort auf die Datenquelle aus, wenn Sie Update aufrufen. Delete Anrufe werden sofort wirksam. Sie können jedoch eine Transaktion einrichten und einen Batch solcher Aufrufe ausführen. Die Updates sind erst dauerhaft, wenn Sie sie committen. Wenn Sie Ihre Meinung ändern, können Sie die Transaktion zurückrollen, anstatt sie zu übernehmen.

Weitere Informationen zu Transaktionen finden Sie unter Transaction (ODBC).For more information about transactions, see Transaction (ODBC).

Wie sich das Schließen des Recordsets auf Updates auswirkt

Wenn Sie ein Recordset oder das zugehörige CDatabase Objekt schließen, wobei eine Transaktion ausgeführt wird (Sie haben CDatabase::CommitTrans oder CDatabase::Rollback nicht aufgerufen), wird die Transaktion automatisch zurückgesetzt (es sei denn, Ihr Datenbank-Back-End ist das Microsoft Jet-Datenbankmodul).

Achtung

Wenn Sie das Microsoft Jet-Datenbankmodul verwenden, führt das Schließen eines Recordsets innerhalb einer expliziten Transaktion nicht dazu, alle Zeilen freizugeben, die geändert oder gesperrt wurden, bis die explizite Transaktion zugesichert oder zurückgesetzt wurde. Es wird empfohlen, Recordsets immer entweder innerhalb oder außerhalb einer expliziten Jet-Transaktion zu öffnen und zu schließen.

Wie der Bildlauf Updates beeinflusst

Wenn Sie recordset: Scrolling (ODBC) in einem Recordset verwenden, wird der Bearbeitungspuffer mit jedem neuen aktuellen Datensatz gefüllt (der vorherige Datensatz wird nicht zuerst gespeichert). Beim Scrollen werden datensätze übersprungen, die zuvor gelöscht wurden. Wenn Sie nach einem AddNew- oder Edit-Aufruf scrollen, ohne zuerst Update, CommitTrans oder Rollback aufzurufen, gehen alle Änderungen verloren (ohne dass Sie gewarnt werden), da ein neuer Datensatz in den Bearbeitungspuffer eingefügt wird. In der Datenquelle werden keine Änderungen vorgenommen, der Editierpuffer wird mit dem Datensatz, zu dem gescrollt wurde, ausgefüllt, und der gespeicherte Datensatz wird gelöscht. Dies gilt für AddNew und Edit.

Ihre Updates und die Updates anderer Benutzer

Wenn Sie ein Recordset zum Aktualisieren von Daten verwenden, wirken sich Ihre Aktualisierungen auf andere Benutzer aus. Ebenso wirken sich die Aktualisierungen anderer Benutzer während der Lebensdauer Ihres Recordsets auf Sie aus.

In einer Mehrbenutzerumgebung können andere Benutzer Recordsets öffnen, die einige der gleichen Datensätze enthalten, die Sie in Ihrem Recordset ausgewählt haben. Änderungen an einem Datensatz werden angezeigt, bevor Sie ihn in Ihrem Recordset abrufen. Da Dynasets bei jedem Scrollen zu einem Datensatz einen Datensatz abrufen, spiegeln sie Änderungen jedes Mal wider, wenn Sie zu einem Datensatz blättern. Momentaufnahmen rufen einen Datensatz ab, wenn Sie zum ersten Mal scrollen, sodass Momentaufnahmen nur die Änderungen widerspiegeln, die vor dem anfänglichen Scrollen zum Datensatz auftreten.

Datensätze, die von anderen Benutzern hinzugefügt wurden, nachdem Sie das Recordset geöffnet haben, werden nicht in Ihrem Recordset angezeigt, es sei denn, Sie werden erneut abgefragt. Wenn ihr Recordset ein Dynaset ist, werden änderungen an vorhandenen Datensätzen von anderen Benutzern in Ihrem Dynaset angezeigt, wenn Sie zum betroffenen Datensatz scrollen. Wenn das Recordset eine Momentaufnahme ist, werden Bearbeitungen erst sichtbar, nachdem Sie die Momentaufnahme erneut abfragen. Wenn Sie Datensätze sehen möchten, die von anderen Benutzern in Ihrer Momentaufnahme hinzugefügt oder gelöscht wurden, oder datensätze, die von anderen Benutzern in Ihrem Dynaset hinzugefügt wurden, rufen Sie CRecordset::Requery auf, um das Recordset neu zu erstellen. (Beachten Sie, dass die Löschungen anderer Benutzer in Ihrem Dynaset angezeigt werden.) Möglicherweise rufen Requery Sie auch auf, um Datensätze anzuzeigen, die Sie hinzufügen, aber nicht, um Ihre Löschungen anzuzeigen.

Tipp

Um das Zwischenspeichern einer gesamten Momentaufnahme zu erzwingen, rufen Sie MoveLast sofort nach dem Öffnen der Momentaufnahme auf. Rufen Sie dann auf MoveFirst , um mit der Arbeit mit den Datensätzen zu beginnen. MoveLast entspricht dem Scrollen aller Datensätze, ruft sie jedoch alle gleichzeitig ab. Beachten Sie jedoch, dass dies die Leistung verringern kann und für einige Treiber möglicherweise nicht erforderlich ist.

Die Auswirkungen Ihrer Updates auf andere Benutzer ähneln ihren Auswirkungen auf Sie.

Weitere Informationen zum Aktualisieren und Löschen

Dieser Abschnitt enthält zusätzliche Informationen, die Ihnen beim Arbeiten mit Update und Delete helfen.

Aktualisierung von Erfolg und Fehler

Wenn Update erfolgreich ist, endet entweder der AddNew- oder der Edit-Modus. Um den AddNew- oder den Edit-Modus erneut zu starten, rufen Sie AddNew oder Edit an.

Wenn Update fehlschlägt (FALSE zurückgibt oder eine Ausnahme auslöst), bleiben Sie im AddNew- oder Edit-Modus, je nachdem, welche Funktion Sie zuletzt aufgerufen haben. Sie können dann einen der folgenden Schritte ausführen:

  • Ändern Sie ein Felddatenelement, und versuchen Sie es Update erneut.

  • Rufen Sie AddNew auf, um die Felddatenmitglieder auf den Nullwert zurückzusetzen und die Werte der Felddatenmitglieder festzulegen, und rufen Sie dann Update erneut auf.

  • Rufen Sie Edit auf, um die Werte neu zu laden, die sich im Recordset vor dem ersten Aufruf von AddNew oder Edit befanden. Setzen Sie die Werte der Felddatenmitglieder fest und rufen Sie dann Update erneut auf. Nach einem erfolgreichen Update Aufruf (mit Ausnahme eines AddNew Anrufs) behalten die Felddatenmember ihre neuen Werte bei.

  • Rufen Sie Move auf (mit Move einem Parameter von AFX_MOVE_REFRESH oder 0), was alle Änderungen durchspült und einen AddNew oder Edit Modus beendet.

Aktualisieren und Löschen

Dieser Abschnitt gilt sowohl für Update als auch für Delete.

Bei einer Update- oder einer Delete-Operation sollte genau ein Datensatz aktualisiert werden. Dieser Datensatz ist der aktuelle Datensatz, der den Datenwerten in den Feldern des Recordsets entspricht. Wenn aus irgendeinem Grund keine Datensätze betroffen sind oder mehrere Datensätze betroffen sind, wird eine Ausnahme ausgelöst, die einen der folgenden RETCODE-Werte enthält:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED

Sie bleiben im Zustand AddNew oder Edit, in dem Sie sich befanden, als Sie Update oder Delete aufgerufen haben, wenn diese Ausnahmen ausgelöst werden. Dies sind die am häufigsten verwendeten Szenarien, in denen diese Ausnahmen angezeigt werden. Sie werden wahrscheinlich Folgendes sehen:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED, wenn Sie den optimistischen Sperrmodus verwenden und ein anderer Benutzer den Datensatz auf eine Weise geändert hat, die verhindert, dass das Framework den richtigen Datensatz identifiziert, der aktualisiert oder gelöscht werden soll.

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED tritt auf, wenn die Tabelle, die Sie aktualisieren, keinen Primärschlüssel oder eindeutigen Index hat und Sie nicht genügend Spalten im Recordset haben, um eine Tabellenzeile eindeutig zu identifizieren.

Siehe auch

Recordset (ODBC)
Recordset: Wie Recordsets Datensätze auswählen (ODBC)
Record Field Exchange (RFX)
SQL
Ausnahmen: Datenbankausnahmen