Freigeben über


Recordset: Funktionsweise von AddNew, Edit und Delete (ODBC)

Dieses Thema bezieht sich auf die MFC-ODBC-Klassen.

In diesem Thema wird erklärt, wie die Mitgliedsfunktionen AddNew, Edit und Delete 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 das Abrufen von Zeilen in großen Mengen 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 als schreibgeschützt geöffnet worden sein. Mit den Memberfunktionen CanUpdate und CanAppend können Sie diese Bedingungen ermitteln.

Wenn Sie AddNew anrufen:

  • Der Datensatz im Bearbeitungspuffer wird gespeichert, sodass der Inhalt wiederhergestellt werden kann, wenn der Vorgang abgebrochen wird.

  • Die Datenfeldmitglieder werden gekennzeichnet, damit später Änderungen daran erkannt werden können. Die Felddatenfelder werden auch als 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 SetFieldNull aufrufen, um den Wert Null anzugeben.

Um Ihre Änderungen zu übernehmen, rufen Sie auf Update. Wenn Sie Update für den neuen Datensatz aufrufen:

  • 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 nicht verwendet werden kann, 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, wird Update 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 fügt den neuen Datensatz ein – die INSERT-Anweisung wird ausgeführt und der Datensatz wird in die Tabelle auf der Datenquelle (und in das Recordset, falls es sich nicht um einen Schnappschuss handelt) übernommen, es sei denn, ein Vorgang ist in Bearbeitung.

    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. Um zu bestimmen, ob ein Feld Null sein darf, rufen Sie IsFieldNullable auf.

    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 SetFieldNull aufrufen, indem Sie die Adresse des Felds im ersten Parameter und FALSE im zweiten Parameter übergeben.

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. Hinzugefügte Datensätze sind mit ::SQLSetPos 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 das Scrollen zum Datensatz, das Aufrufen der Edit-Memberfunktion des Recordsets, das Festlegen der Werte der Mitglieder der Felddaten des neuen Datensatzes und das Aufrufen der Update-Memberfunktion, um den geänderten Datensatz in die Datenquelle zu schreiben.

Als Voraussetzung für den Aufruf Editmuss das Recordset aktualisierbar und auf einem Datensatz sein. Mit den Memberfunktionen CanUpdate und IsDeleted 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 von 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 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 SetFieldNull aufrufen, um den Wert Null anzugeben. Rufen Sie Update auf, um Ihre Änderungen zu übernehmen.

Tipp

Um den AddNew- oder Edit-Modus zu beenden, rufen Sie Move mit dem 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 Update für den bearbeiteten Datensatz aufrufen:

  • 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 vergleicht der Treiber den Bearbeitungspuffer mit dem entsprechenden Datensatz auf dem Server und aktualisiert den Datensatz auf dem Server, wenn die beiden unterschiedlich sind. Mit ::SQLSetPos kann MFC einen Datensatz effizienter aktualisieren, da es keine SQL-Anweisung erstellen und verarbeiten muss.

    - oder -

  • Wenn ::SQLSetPos nicht verwendet werden kann, 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, erstellt Update eine SQL UPDATE-Anweisung. Die Spalten, die in der UPDATE-Anweisung aufgeführt sind, basieren auf den Felddatenmitgliedern, die sich geändert haben.

    3. Update übernimmt die Änderungen — führt die UPDATE-Anweisung aus — und der Datensatz wird in der Datenquelle geändert, aber nicht übernommen, falls eine Transaktion im Gange ist (siehe Transaktion: Ausführen einer Transaktion in einem Recordset (ODBC) für Informationen darüber, wie die Transaktion das Update beeinflusst). ODBC behält eine Kopie des Datensatzes, die sich ebenfalls ändert.

    4. Im Gegensatz zum Prozess für AddNew stellt der Edit-Prozess den 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 zuvor AddNew oder Edit aufgerufen haben, aber bevor Sie Update aufrufen, wird der Bearbeitungspuffer mit dem gespeicherten Datensatz aktualisiert, und der neue oder bearbeitete Datensatz wird ersetzt. Mit diesem Verhalten können Sie eine AddNew oder Edit abbrechen und eine neue beginnen: Wenn Sie feststellen, dass der aktuelle Datensatz fehlerhaft ist, rufen Sie einfach Edit oder AddNew erneut auf.

Löschen eines Datensatzes

Das Löschen eines Datensatzes aus einem Recordset umfasst das Scrollen zum Datensatz und das Aufrufen der Delete-Mitgliedsfunktion des Recordsets. Im Gegensatz zu AddNew und Edit erfordert Delete keinen entsprechenden Aufruf Update.

Als Voraussetzung für das Aufrufen Deletemuss das Recordset aktualisierbar sein und muss sich auf einem Datensatz befindet. Die Member-Funktionen CanUpdate, IsBOF, IsEOF und IsDeleted erlauben es Ihnen, diese Bedingungen zu bestimmen.

Wenn Sie Delete anrufen:

  • 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 nicht verwendet werden kann, führt MFC die folgenden Aktionen aus:

    1. Der aktuelle Eintrag im Bearbeitungspuffer wird nicht gesichert 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 das Löschen durch und führt die DELETE-Anweisung aus. Der Datensatz wird in der Datenquelle als gelöscht markiert und, wenn der Datensatz eine Momentaufnahme ist, auch in ODBC.

    4. Die Werte des gelöschten Datensatzes befinden sich weiterhin in den Felddatenelementen des Recordsets, jedoch sind die Felddatenelemente als 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 ist ein Fehler, Delete erneut aufzurufen oder Edit aufzurufen.

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)
Record Field Exchange (RFX)