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 Massenzeilen implementiert haben, gelten einige der Informationen nicht. Beispielsweise können Sie die AddNewFunktionen , Edit, Delete, und Update Member nicht aufrufen. Sie können jedoch Transaktionen ausführen. Weitere Informationen zum Abrufen von Massenzeilen finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information about bulk row fetching, see Recordset: Fetching Records in Bulk (ODBC).For more information

Auswirkungen anderer Vorgänge auf Updates

Ihre Aktualisierungen sind von Transaktionen betroffen, die zum Zeitpunkt der Aktualisierung wirksam sind, indem sie das Recordset schließen, bevor sie eine Transaktion abschließen, und durch Scrollen vor Abschluss einer Transaktion.

Auswirkungen von Transaktionen auf Updates

Darüber hinaus ist es wichtig zu verstehen, wie AddNewEditDelete die CommitTransBeginTransFunktionen und Rollback Member von CDatabase mit den Updatefunktionen von CRecordset funktionieren.

Standardmäßig werden Aufrufe AddNew und Edit Auswirkungen auf die Datenquelle sofort beim Aufrufen.Update 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 übernehmen. Wenn Sie Ihre Meinung ändern, können Sie das Rollback der Transaktion rückgängig machen, anstatt es 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 innerhalb oder außerhalb einer expliziten Jet-Transaktion immer zu öffnen und zu schließen.

Auswirkungen des Bildlaufs auf Updates

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 einen Bildlauf nach einem AddNew Oder Edit Anruf ohne Aufruf Rollback UpdateCommitTransoder zuerst ausführen, gehen alle Änderungen verloren (ohne Warnung an Sie), da ein neuer Datensatz in den Bearbeitungspuffer eingefügt wird. Der Bearbeitungspuffer wird mit dem Datensatz ausgefüllt, der gespeicherte Datensatz wird freigegeben, und in der Datenquelle tritt keine Änderung auf. 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, bevor Sie ihn abrufen, werden in Ihrem Recordset widerzuspiegeln. Da Dynasets bei jedem Bildlauf zu einem Datensatz einen Datensatz abrufen, spiegeln Dynasets änderungen bei jedem Bildlauf zu einem Datensatz wider. 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 angezeigt, wenn 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 gleichzeitig zu erzwingen, rufen MoveLast Sie 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 helfen Delete.

Erfolg und Fehler aktualisieren

Wenn Update dies erfolgreich ist, wird der AddNew Modus Edit beendet. Um einen oder Edit einen AddNew Modus erneut zu starten, rufen Sie AddNew oder Edit.

Wenn Update ein Fehler auftritt (gibt FALSE zurück oder löst eine Ausnahme aus), bleiben Sie je nach der Funktion, die Sie zuletzt aufgerufen haben, im AddNew Modus Edit . Sie können dann einen der folgenden Schritte ausführen:

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

  • Rufen Sie AddNew auf, um die Felddatenmber auf Null zurückzusetzen, die Werte der Felddatenmber festzulegen und dann erneut aufzurufen Update .

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

  • Aufruf Move (einschließlich Move eines Parameters von AFX_MOVE_REFRESH oder 0), der alle Änderungen löscht und einen beliebigen AddNew Oder Edit Modus in Kraft setzt.

Aktualisieren und Löschen

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

Bei einem oder Delete einem Update Vorgang sollte nur 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

Wenn diese Ausnahmen ausgelöst werden, verbleiben Sie im Zustand, Edit in dem AddNew Sie sich befanden, wenn Sie aufgerufen Update oder Delete. 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, wenn die zu aktualisierende Tabelle keinen Primärschlüssel oder eindeutigen Index aufweist 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)
Datensatzfeldaustausch (RFX)
SQL
Ausnahmen: Datenbankausnahmen