Recordset: Weitere Informationen zu Aktualisierungen (ODBC)
Dieses Thema bezieht sich auf die MFC-ODBC-Klassen.
In diesem Thema wird Folgendes erläutert:
Wie sich andere Vorgänge, z. B. Transaktionen, auf Updates auswirken.
Weitere Informationen zu den Memberfunktionen "Aktualisieren" und "Löschen"
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 AddNew
Funktionen , 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 AddNew
Edit
Delete
die CommitTrans
BeginTrans
Funktionen 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
Update
CommitTrans
oder 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 aufzurufenUpdate
.Rufen Sie auf
Edit
, um die Werte neu zu laden, die sich vor dem ersten AufrufAddNew
im Recordset befanden, oderEdit
legen Sie die Werte der Felddatenmber fest, und rufen Sie dann erneut aufUpdate
. Nach einem erfolgreichenUpdate
Aufruf (mit Ausnahme einesAddNew
Anrufs) behalten die Felddatenmember ihre neuen Werte bei.Aufruf
Move
(einschließlichMove
eines Parameters von AFX_MOVE_REFRESH oder 0), der alle Änderungen löscht und einen beliebigenAddNew
OderEdit
Modus in Kraft setzt.
Aktualisieren und Löschen
Dieser Abschnitt gilt sowohl für als auch Update
Delete
fü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