Recordset: Funktionsweise von AddNew, Edit und Delete (ODBC)
Dieses Thema bezieht sich auf die MFC-ODBC-Klassen.
In diesem Thema wird erläutert, wie die AddNew
Edit
Funktionen und Delete
Memberfunktionen der Klasse CRecordset
funktionieren. Folgende Themen werden behandelt:
Hinweis
Dieses Thema bezieht sich auf von CRecordset
abgeleitete Objekte, in denen das gesammelte Abrufen von Zeilen nicht implementiert wurde. Wenn Sie massenweises Abrufen von Zeilen verwenden, lesen Sie "Recordset: Fetching Records in Bulk (ODBC)".
Als Ergänzung möchten Sie vielleicht "Record Field Exchange: How RFX Works" lesen, das die entsprechende Rolle von RFX bei Aktualisierungsvorgängen beschreibt.
Hinzufügen eines Datensatzes
Das Hinzufügen eines neuen Datensatzes zu einem Recordset umfasst das Aufrufen der AddNew-Memberfunktion des Recordsets, das Festlegen der Werte der Felddatenmember des neuen Datensatzes und das Aufrufen der Update-Memberfunktion zum Schreiben des Datensatzes in die Datenquelle.
Als Voraussetzung für das Aufrufen AddNew
darf das Recordset nicht schreibgeschützt geöffnet worden sein. Mit den CanUpdate
Funktionen und CanAppend
Memberfunktionen können Sie diese Bedingungen ermitteln.
Wenn Sie anrufen AddNew
:
Der Datensatz im Bearbeitungspuffer wird gespeichert, sodass der Inhalt wiederhergestellt werden kann, wenn der Vorgang abgebrochen wird.
Die Felddatenmber werden gekennzeichnet, sodass später Änderungen erkannt werden können. Die Felddatenmember werden auch als sauber (unverändert) gekennzeichnet und auf null festgelegt.
Nach dem Aufrufen AddNew
stellt der Bearbeitungspuffer einen neuen, leeren Datensatz dar, der bereit ist, mit Werten ausgefüllt zu werden. Dazu legen Sie die Werte manuell fest, indem Sie sie zuweisen. Anstatt einen tatsächlichen Datenwert für ein Feld anzugeben, können Sie den SetFieldNull
Wert Null angeben.
Um Ihre Änderungen zu übernehmen, rufen Sie auf Update
. Wenn Sie den neuen Datensatz anrufen Update
:
Wenn Ihr ODBC-Treiber die
::SQLSetPos
ODBC-API-Funktion unterstützt, verwendet MFC die Funktion, um den Datensatz der Datenquelle hinzuzufügen. Mit::SQLSetPos
, MFC kann einen Datensatz effizienter hinzufügen, da es nicht erforderlich ist, eine SQL-Anweisung zu erstellen und zu verarbeiten.Wenn
::SQLSetPos
dies nicht möglich ist, führt MFC die folgenden Aktionen aus:Wenn keine Änderungen erkannt werden,
Update
führt nichts aus und gibt "0" zurück.Wenn Änderungen vorhanden sind,
Update
wird eine SQL INSERT-Anweisung erstellt. Die spalten, die durch alle elemente der geänderten Felddaten dargestellt werden, werden in der INSERT-Anweisung aufgeführt. Rufen Sie die SetFieldDirty-Memberfunktion auf, um die Aufnahme einer Spalte zu erzwingen:SetFieldDirty( &m_dataMember, TRUE );
Update
commits the new record - the INSERT statement is executed and the record is commit to the table on the data source (and the recordset, if not a snapshot), if not a snapshot) unless a transaction is in progress.Der gespeicherte Datensatz wird im Bearbeitungspuffer wiederhergestellt. Der Datensatz, der vor dem
AddNew
Aufruf aktuell war, ist unabhängig davon, ob die INSERT-Anweisung erfolgreich ausgeführt wurde.
Tipp
Um die vollständige Kontrolle über einen neuen Datensatz zu erhalten, gehen Sie wie folgt vor: Legen Sie die Werte aller Felder fest, die Werte enthalten, und legen Sie dann explizit alle Felder fest, die null bleiben, indem Sie einen Zeiger auf das Feld und den Parameter TRUE (Standardeinstellung) aufrufen
SetFieldNull
. Wenn Sie sicherstellen möchten, dass ein Feld nicht in die Datenquelle geschrieben wird, rufenSetFieldDirty
Sie mit einem Zeiger auf das Feld und den Parameter FALSE auf, und ändern Sie den Wert des Felds nicht. Rufen Sie auf, umIsFieldNullable
zu bestimmen, ob ein Feld Null sein darf.Tipp
Um zu erkennen, wann recordset-Datenmember den Wert ändern, verwendet MFC einen PSEUDO_NULL Wert, der für jeden Datentyp geeignet ist, den Sie in einem Recordset speichern können. Wenn Sie ein Feld explizit auf den PSEUDO_NULL Wert festlegen müssen und das Feld bereits als Null gekennzeichnet ist, müssen Sie auch die Adresse des Felds im ersten Parameter und FALSE im zweiten Parameter übergeben
SetFieldNull
.
Sichtbarkeit von hinzugefügten Datensätzen
Wann ist ein hinzugefügter Datensatz für Ihr Recordset sichtbar? Hinzugefügte Datensätze werden manchmal angezeigt und sind je nach zwei Dingen manchmal nicht sichtbar:
Was Ihr Fahrer kann.
Was das Framework nutzen kann.
Wenn Ihr ODBC-Treiber die ::SQLSetPos
ODBC-API-Funktion unterstützt, verwendet MFC die Funktion zum Hinzufügen von Datensätzen. Mit ::SQLSetPos
, hinzugefügte Datensätze sind für jedes aktualisierbare MFC-Recordset sichtbar. Ohne Unterstützung für die Funktion sind hinzugefügte Datensätze nicht sichtbar, und Sie müssen aufrufen Requery
, um sie anzuzeigen. Die Verwendung ::SQLSetPos
ist auch effizienter.
Bearbeiten eines vorhandenen Datensatzes
Das Bearbeiten eines vorhandenen Datensatzes in einem Recordset umfasst einen Bildlauf zum Datensatz, das Aufrufen der Edit-Memberfunktion des Recordsets, das Festlegen der Werte der Felddatenmember des neuen Datensatzes und das Aufrufen der Update-Memberfunktion zum Schreiben des geänderten Datensatzes in die Datenquelle.
Als Voraussetzung für den Aufruf Edit
muss das Recordset aktualisierbar und auf einem Datensatz sein. Mit den CanUpdate
Funktionen und IsDeleted
Memberfunktionen können Sie diese Bedingungen ermitteln. Der aktuelle Datensatz darf auch nicht bereits gelöscht worden sein, und es müssen Datensätze im Recordset vorhanden sein (beide IsBOF
und IsEOF
0 zurückgeben).
Beim Aufrufen Edit
wird der Datensatz im Bearbeitungspuffer (der aktuelle Datensatz) gespeichert. Die Werte des gespeicherten Datensatzes werden später verwendet, um zu ermitteln, ob sich Felder geändert haben.
Nach dem Aufruf Edit
stellt der Bearbeitungspuffer weiterhin den aktuellen Datensatz dar, ist aber jetzt bereit, Änderungen an den Felddatenelementen anzunehmen. Um den Datensatz zu ändern, legen Sie die Werte aller Felddatenmber, die Sie bearbeiten möchten, manuell fest. Anstatt einen tatsächlichen Datenwert für ein Feld anzugeben, können Sie den SetFieldNull
Wert Null angeben. Rufen Sie auf, um Update
Ihre Änderungen zu übernehmen.
Tipp
Um den AddNew
Modus zu beenden, Edit
rufen Sie Move
den Parameter AFX_MOVE_REFRESH auf.
Als Voraussetzung für das Aufrufen Update
darf das Recordset nicht leer sein, und der aktuelle Datensatz darf nicht gelöscht worden sein. IsBOF
, IsEOF
und IsDeleted
sollte alle 0 zurückgeben.
Wenn Sie den bearbeiteten Datensatz anrufen Update
:
Wenn Ihr ODBC-Treiber die
::SQLSetPos
ODBC-API-Funktion unterstützt, verwendet MFC die Funktion, um den Datensatz in der Datenquelle zu aktualisieren. Mit::SQLSetPos
dem Treiber wird der Bearbeitungspuffer mit dem entsprechenden Datensatz auf dem Server verglichen, wobei der Datensatz auf dem Server aktualisiert wird, wenn die beiden unterschiedlich sind. MFC::SQLSetPos
kann einen Datensatz effizienter aktualisieren, da er keine SQL-Anweisung erstellen und verarbeiten muss.- oder -
Wenn
::SQLSetPos
dies nicht möglich ist, führt MFC die folgenden Aktionen aus:Wenn keine Änderungen vorgenommen wurden,
Update
führt nichts aus und gibt "0" zurück.Wenn Änderungen vorhanden sind,
Update
wird eine SQL UPDATE-Anweisung erstellt. Die spalten, die in der UPDATE-Anweisung aufgeführt sind, basieren auf den Felddatenmmbern, die sich geändert haben.Update
commits the changes — executes the UPDATE statement — and the record is changed on the data source, but not commit if a transaction is in progress (see Transaction: Performing a Transaction in a Recordset (ODBC) for information about how the transaction affects the update). ODBC behält eine Kopie des Datensatzes bei, was sich ebenfalls ändert.Im Gegensatz zum Prozess für
AddNew
den Vorgang stellt der Prozess denEdit
gespeicherten Datensatz nicht wieder her. Der bearbeitete Datensatz bleibt als aktueller Datensatz vorhanden.
Achtung
Wenn Sie sich darauf vorbereiten, ein Recordset durch Aufrufen
Update
zu aktualisieren, achten Sie darauf, dass das Recordset alle Spalten enthält, die den Primärschlüssel der Tabelle bilden (oder alle Spalten eines eindeutigen Indexes in der Tabelle oder genügend Spalten, um die Zeile eindeutig zu identifizieren). In einigen Fällen kann das Framework zur Identifizierung des Datensatzes, der in der Tabelle aktualisiert werden soll, nur die Spalten verwenden, die im Recordset ausgewählt sind. Ohne alle erforderlichen Spalten werden möglicherweise mehrere Datensätze in der Tabelle aktualisiert. In diesem Fall löst das Framework Ausnahmen aus, wenn Sie aufrufenUpdate
.Tipp
Wenn Sie
AddNew
Edit
eine oder mehrere Funktionen zuvor aufgerufen haben, aber bevor Sie sie aufrufenUpdate
, wird der Bearbeitungspuffer mit dem gespeicherten Datensatz aktualisiert, wobei der neue oder bearbeitete Datensatz ersetzt wird. Mit diesem Verhalten können Sie eineAddNew
oder mehrere neue abbrechen undEdit
beginnen: Wenn Sie feststellen, dass der aktuelle Datensatz fehlerhaft ist, rufen Sie einfach oderAddNew
erneut aufEdit
.
Löschen eines Datensatzes
Das Löschen eines Datensatzes aus einem Recordset umfasst einen Bildlauf zum Datensatz und das Aufrufen der Delete-Memberfunktion des Recordsets. Im Gegensatz AddNew
zu und Edit
, Delete
erfordert keinen übereinstimmenden Aufruf an Update
.
Als Voraussetzung für das Aufrufen Delete
muss das Recordset aktualisierbar sein und muss sich auf einem Datensatz befindet. Mit den CanUpdate
Funktionen , IsBOF
, , IsEOF
und IsDeleted
Member können Sie diese Bedingungen bestimmen.
Wenn Sie anrufen Delete
:
Wenn Ihr ODBC-Treiber die
::SQLSetPos
ODBC-API-Funktion unterstützt, verwendet MFC die Funktion, um den Datensatz in der Datenquelle zu löschen. Die Verwendung::SQLSetPos
ist in der Regel effizienter als die Verwendung von SQL.- oder -
Wenn
::SQLSetPos
dies nicht möglich ist, führt MFC die folgenden Aktionen aus:Der aktuelle Datensatz im Bearbeitungspuffer wird nicht wie in
AddNew
undEdit
.Delete
erstellt eine SQL DELETE-Anweisung, die den Datensatz entfernt.Der aktuelle Datensatz im Bearbeitungspuffer wird nicht wie in
AddNew
undEdit
gespeichert.Delete
führt die DELETE-Anweisung aus. Der Datensatz wird in der Datenquelle gelöscht, und wenn der Datensatz eine Momentaufnahme ist, in ODBC.Die Werte des gelöschten Datensatzes befinden sich weiterhin in den Felddatenmembern des Recordsets, aber die Felddatenmember sind null markiert, und die Memberfunktion des
IsDeleted
Recordsets gibt einen Wert ungleich Null zurück.
Hinweis
Nach dem Löschen eines Datensatzes sollten Sie zu einem anderen Datensatz scrollen, um den Bearbeitungspuffer mit den Daten des neuen Datensatzes erneut zu füllen. Es handelt sich um einen Fehler, den Sie erneut anrufen
Delete
oder anrufenEdit
möchten.
Informationen zu den SQL-Anweisungen, die in Aktualisierungsvorgängen verwendet werden, finden Sie unter SQL.
Siehe auch
Recordset (ODBC)
Recordset: Weitere Informationen zu Aktualisierungen (ODBC)
Datensatzfeldaustausch (RFX)