Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 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
Updateerneut.Rufen Sie
AddNewauf, um die Felddatenmitglieder auf den Nullwert zurückzusetzen und die Werte der Felddatenmitglieder festzulegen, und rufen Sie dannUpdateerneut auf.Rufen Sie
Editauf, um die Werte neu zu laden, die sich im Recordset vor dem ersten Aufruf vonAddNewoderEditbefanden. Setzen Sie die Werte der Felddatenmitglieder fest und rufen Sie dannUpdateerneut auf. Nach einem erfolgreichenUpdateAufruf (mit Ausnahme einesAddNewAnrufs) behalten die Felddatenmember ihre neuen Werte bei.Rufen Sie
Moveauf (mitMoveeinem Parameter von AFX_MOVE_REFRESH oder 0), was alle Änderungen durchspült und einenAddNewoderEditModus 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