Freigeben über


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 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 ::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:

    1. Wenn keine Änderungen erkannt werden, Update führt nichts aus und gibt "0" zurück.

    2. 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 );
      
    3. 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.

    4. 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, rufen SetFieldDirty Sie mit einem Zeiger auf das Feld und den Parameter FALSE auf, und ändern Sie den Wert des Felds nicht. Rufen Sie auf, um IsFieldNullablezu 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 ::SQLSetPos ODBC-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 ::SQLSetPos dies nicht möglich ist, führt MFC die folgenden Aktionen aus:

    1. Wenn keine Änderungen vorgenommen wurden, Update führt nichts aus und gibt "0" zurück.

    2. 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.

    3. 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.

    4. Im Gegensatz zum Prozess für AddNewden Vorgang stellt der Prozess den Edit gespeicherten 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 aufrufen Update.

    Tipp

    Wenn Sie AddNew Edit eine oder mehrere Funktionen zuvor aufgerufen haben, aber bevor Sie sie aufrufen Update, wird der Bearbeitungspuffer mit dem gespeicherten Datensatz aktualisiert, wobei der neue oder bearbeitete Datensatz ersetzt wird. Mit diesem Verhalten können Sie eine AddNew oder mehrere neue abbrechen und Edit beginnen: Wenn Sie feststellen, dass der aktuelle Datensatz fehlerhaft ist, rufen Sie einfach oder AddNew 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 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 ::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:

    1. Der aktuelle Datensatz im Bearbeitungspuffer wird nicht wie in AddNew und Edit.

    2. Deleteerstellt eine SQL DELETE-Anweisung, die den Datensatz entfernt.

      Der aktuelle Datensatz im Bearbeitungspuffer wird nicht wie in AddNew und Editgespeichert.

    3. Deleteführt die DELETE-Anweisung aus. Der Datensatz wird in der Datenquelle gelöscht, und wenn der Datensatz eine Momentaufnahme ist, in ODBC.

    4. 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 anrufen Editmö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)