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 erläutert, wie die AddNewEditFunktionen 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 AddNewdarf 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 AddNewstellt 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
::SQLSetPosODBC-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
::SQLSetPosdies nicht möglich ist, führt MFC die folgenden Aktionen aus:Wenn keine Änderungen erkannt werden,
Updateführt nichts aus und gibt "0" zurück.Wenn Änderungen vorhanden sind,
Updatewird 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 );Updatecommits 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
AddNewAufruf 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, rufenSetFieldDirtySie mit einem Zeiger auf das Feld und den Parameter FALSE auf, und ändern Sie den Wert des Felds nicht. Rufen Sie auf, umIsFieldNullablezu 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 Editmuss 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 Editwird 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 Editstellt 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 UpdateIhre Ä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 Updatedarf das Recordset nicht leer sein, und der aktuelle Datensatz darf nicht gelöscht worden sein.
IsBOF, IsEOFund IsDeleted sollte alle 0 zurückgeben.
Wenn Sie den bearbeiteten Datensatz anrufen Update :
Wenn Ihr ODBC-Treiber die
::SQLSetPosODBC-API-Funktion unterstützt, verwendet MFC die Funktion, um den Datensatz in der Datenquelle zu aktualisieren. Mit::SQLSetPosdem 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::SQLSetPoskann einen Datensatz effizienter aktualisieren, da er keine SQL-Anweisung erstellen und verarbeiten muss.- oder -
Wenn
::SQLSetPosdies nicht möglich ist, führt MFC die folgenden Aktionen aus:Wenn keine Änderungen vorgenommen wurden,
Updateführt nichts aus und gibt "0" zurück.Wenn Änderungen vorhanden sind,
Updatewird eine SQL UPDATE-Anweisung erstellt. Die spalten, die in der UPDATE-Anweisung aufgeführt sind, basieren auf den Felddatenmmbern, die sich geändert haben.Updatecommits 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
AddNewden Vorgang stellt der Prozess denEditgespeicherten Datensatz nicht wieder her. Der bearbeitete Datensatz bleibt als aktueller Datensatz vorhanden.
Achtung
Wenn Sie sich darauf vorbereiten, ein Recordset durch Aufrufen
Updatezu 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
AddNewEditeine 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 eineAddNewoder mehrere neue abbrechen undEditbeginnen: Wenn Sie feststellen, dass der aktuelle Datensatz fehlerhaft ist, rufen Sie einfach oderEditerneut aufAddNew.
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 Deletemuss das Recordset aktualisierbar sein und muss sich auf einem Datensatz befindet. Mit den CanUpdateFunktionen , IsBOF, , IsEOFund IsDeleted Member können Sie diese Bedingungen bestimmen.
Wenn Sie anrufen Delete:
Wenn Ihr ODBC-Treiber die
::SQLSetPosODBC-API-Funktion unterstützt, verwendet MFC die Funktion, um den Datensatz in der Datenquelle zu löschen. Die Verwendung::SQLSetPosist in der Regel effizienter als die Verwendung von SQL.- oder -
Wenn
::SQLSetPosdies nicht möglich ist, führt MFC die folgenden Aktionen aus:Der aktuelle Datensatz im Bearbeitungspuffer wird nicht wie in
AddNewundEdit.Deleteerstellt eine SQL DELETE-Anweisung, die den Datensatz entfernt.Der aktuelle Datensatz im Bearbeitungspuffer wird nicht wie in
AddNewundEditgespeichert.Deletefü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
IsDeletedRecordsets 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
Deleteoder anrufenEditmö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)