Recordset: Hoe AddNew, Bewerken en Verwijderen Werken (ODBC)

Dit onderwerp is van toepassing op de MFC ODBC-klassen.

In dit onderwerp wordt uitgelegd hoe de functies AddNew, Edit en Delete van de leden van klasse CRecordset werken. Onderwerpen die worden behandeld, zijn onder andere:

Opmerking

Dit onderwerp is van toepassing op objecten die zijn afgeleid van CRecordset waaruit bulksgewijs ophalen van rijen niet is geïmplementeerd. Zie Recordset: Recordset ophalen in bulk (ODBC) als u bulksgewijs rijen ophaalt.

Als aanvulling kunt u recordvelduitwisseling lezen: hoe RFX werkt, waarin de bijbehorende rol van RFX in updatebewerkingen wordt beschreven.

Een record toevoegen

Het toevoegen van een nieuwe record aan een recordset omvat het aanroepen van de functie AddNew member van de recordset, het instellen van de waarden van de leden van de nieuwe recordveldgegevens en het aanroepen van de functie Lid bijwerken om de record naar de gegevensbron te schrijven.

Als voorwaarde voor het aanroepen van AddNew mag de recordset niet in alleen-lezen-modus geopend zijn. Met de lidfuncties CanUpdate en CanAppend kunt u deze voorwaarden bepalen.

Wanneer u belt AddNew:

  • De record in de bewerkingsbuffer wordt opgeslagen, zodat de inhoud ervan kan worden hersteld als de bewerking wordt geannuleerd.

  • De leden van de veldgegevens worden gemarkeerd, zodat het mogelijk is om wijzigingen later te detecteren. De leden van de veldgegevens worden ook gemarkeerd als opschonen (ongewijzigd) en ingesteld op een Null.

Nadat u de aanroep AddNewhebt uitgevoerd, vertegenwoordigt de bewerkingsbuffer een nieuwe, lege record, die klaar is om met waarden te worden ingevuld. Hiervoor stelt u de waarden handmatig in door ze toe te wijzen. In plaats van een werkelijke gegevenswaarde voor een veld op te geven, kunt u aanroepen SetFieldNull om de waarde Null op te geven.

Als u uw wijzigingen wilt doorvoeren, roept u aan Update. Wanneer u Update aanroept voor het nieuwe record:

  • Als uw ODBC-stuurprogramma de ::SQLSetPos ODBC-API-functie ondersteunt, gebruikt MFC de functie om de record toe te voegen aan de gegevensbron. Met ::SQLSetPosMFC kan een record efficiënter worden toegevoegd omdat er geen SQL-instructie hoeft te worden gemaakt en verwerkt.

  • Als ::SQLSetPos niet kan worden gebruikt, doet MFC het volgende:

    1. Als er geen wijzigingen worden gedetecteerd, doet Update niets en retourneert 0.

    2. Als er wijzigingen zijn, Update maakt een SQL INSERT-instructie aan. De kolommen die worden weergegeven door alle leden van vuile veldgegevens, worden weergegeven in de insert-instructie . Als u wilt afdwingen dat een kolom wordt opgenomen, roept u de functie SetFieldDirty-lid aan:

      SetFieldDirty( &m_dataMember, TRUE );
      
    3. Update de nieuwe record doorvoert: de INSERT-instructie wordt uitgevoerd en de record wordt doorgevoerd in de tabel in de gegevensbron (en de recordset, als er geen momentopname is) tenzij er een transactie wordt uitgevoerd.

    4. De opgeslagen record wordt hersteld naar de bewerkingsbuffer. De record die actueel was vóór de AddNew aanroep, is opnieuw actueel, ongeacht of de INSERT-instructie is uitgevoerd.

    Aanbeveling

    Voor volledige controle over een nieuwe record moet u de volgende methode gebruiken: stel de waarden in van alle velden met waarden en stel vervolgens expliciet velden in die Null blijven door een aanwijzer aan te roepen SetFieldNull naar het veld en de parameter TRUE (de standaardwaarde). Als u ervoor wilt zorgen dat een veld niet naar de gegevensbron wordt geschreven, roept SetFieldDirty u een aanwijzer naar het veld en de parameter FALSE aan en wijzigt u de waarde van het veld niet. Als u wilt bepalen of een veld null mag zijn, roept u aan IsFieldNullable.

    Aanbeveling

    Als u wilt detecteren wanneer recordsetgegevensleden de waarde wijzigen, gebruikt MFC een PSEUDO_NULL waarde die geschikt is voor elk gegevenstype dat u in een recordset kunt opslaan. Als u expliciet een veld moet instellen op de PSEUDO_NULL waarde en het veld al als nul wordt gemarkeerd, moet u ook SetFieldNull het adres van het veld in de eerste parameter doorgeven en ONWAAR in de tweede parameter.

Zichtbaarheid van toegevoegde records

Wanneer is een toegevoegde record zichtbaar voor uw recordset? Toegevoegde records worden soms weergegeven en zijn soms niet zichtbaar, afhankelijk van twee dingen:

  • Waar uw chauffeur in staat is.

  • Waar het framework van kan profiteren.

Als uw ODBC-stuurprogramma de ::SQLSetPos ODBC-API-functie ondersteunt, gebruikt MFC de functie om records toe te voegen. Met ::SQLSetPos zijn toegevoegde records zichtbaar voor elke bijwerkbare MFC-recordset. Zonder ondersteuning voor de functie zijn toegevoegde records niet zichtbaar en moet u aanroepen Requery om deze te zien. Het gebruik ::SQLSetPos is ook efficiënter.

Een bestaande record bewerken

Het bewerken van een bestaande record in een recordset omvat het schuiven naar de record, het aanroepen van de functie Lid bewerken van de recordset, het instellen van de waarden van de leden van het veldgegevens van de nieuwe record en het aanroepen van de functie Lid bijwerken om de gewijzigde record naar de gegevensbron te schrijven.

Als voorwaarde voor het aanroepen van Edit moet de recordset bijgewerkt kunnen worden en zich op een specifieke record bevinden. Met de lidfuncties CanUpdate en IsDeleted kunt u deze voorwaarden bepalen. De huidige record mag ook nog niet zijn verwijderd en er moeten records in de recordset aanwezig zijn (zowel IsBOF als IsEOF moeten 0 zijn).

Wanneer u aanroept Edit, wordt de record in de bewerkingsbuffer (de huidige record) opgeslagen. De waarden van de opgeslagen record worden later gebruikt om te detecteren of velden zijn gewijzigd.

Nadat u de aanroep Edithebt uitgevoerd, vertegenwoordigt de bewerkingsbuffer nog steeds de huidige record, maar is nu klaar om wijzigingen in de leden van de veldgegevens te accepteren. Als u de record wilt wijzigen, stelt u handmatig de waarden in van alle veldgegevensleden die u wilt bewerken. In plaats van een werkelijke gegevenswaarde voor een veld op te geven, kunt u aanroepen SetFieldNull om de waarde Null op te geven. Om uw wijzigingen door te voeren, roept u Update aan.

Aanbeveling

Om uit de AddNew- of Edit-modus te gaan, roept u Move op met de parameter AFX_MOVE_REFRESH.

Als voorwaarde voor het aanroepen Updatemag de recordset niet leeg zijn en mag de huidige record niet zijn verwijderd. IsBOF, IsEOFen IsDeleted moet alle 0 retourneren.

Wanneer u het bewerkte record aanroept Update:

  • Als uw ODBC-stuurprogramma de ::SQLSetPos ODBC-API-functie ondersteunt, gebruikt MFC de functie om de record in de gegevensbron bij te werken. Hiermee ::SQLSetPosvergelijkt het stuurprogramma uw bewerkingsbuffer met de bijbehorende record op de server, waarbij de record op de server wordt bijgewerkt als de twee verschillen. Met ::SQLSetPosMFC kan een record efficiënter worden bijgewerkt omdat er geen SQL-instructie hoeft te worden gemaakt en verwerkt.

    -of-

  • Als ::SQLSetPos niet kan worden gebruikt, doet MFC het volgende:

    1. Als er geen wijzigingen zijn aangebracht, Update doet niets en retourneert 0.

    2. Als er wijzigingen zijn, Update construeert een SQL UPDATE-instructie. De kolommen die in de UPDATE-instructie worden vermeld, zijn gebaseerd op de leden van de veldgegevens die zijn gewijzigd.

    3. Update voert de wijzigingen door ( voert de UPDATE-instructie uit) en de record wordt gewijzigd in de gegevensbron, maar wordt niet doorgevoerd als een transactie wordt uitgevoerd (zie Transactie: Een transactie uitvoeren in een recordset (ODBC) voor informatie over hoe de transactie van invloed is op de update). ODBC bewaart een kopie van de record, die ook wordt gewijzigd.

    4. In tegenstelling tot het proces voor AddNew, herstelt het Edit proces de opgeslagen record niet. Het bewerkte record blijft behouden als het huidige record.

    Waarschuwing

    Wanneer u zich voorbereidt om een recordset bij te werken door aan te roepen Update, moet u ervoor zorgen dat uw recordset alle kolommen bevat die de primaire sleutel van de tabel vormen (of alle kolommen van een unieke index in de tabel, of voldoende kolommen om de rij uniek te identificeren). In sommige gevallen kan het framework alleen de kolommen gebruiken die in uw recordset zijn geselecteerd om te bepalen welke record in de tabel moet worden bijgewerkt. Zonder alle benodigde kolommen kunnen meerdere records in de tabel worden bijgewerkt. In dit geval genereert het framework uitzonderingen wanneer u aanroept Update.

    Aanbeveling

    Als u aanroept AddNew of Edit nadat u een van de functies eerder hebt aangeroepen, maar voordat u aanroept Update, wordt de bewerkingsbuffer vernieuwd door de opgeslagen record, waarbij de nieuwe of bewerkte record wordt vervangen. Dit gedrag biedt u de mogelijkheid om een AddNew of Edit af te breken en een nieuwe te starten: als u vaststelt dat de lopende opname defect is, roept u eenvoudig Edit of AddNew opnieuw aan.

Een record verwijderen

Als u een record uit een recordset verwijdert, schuift u naar de record en roept u de functie Lid verwijderen van de recordset aan. In tegenstelling tot AddNew en Edit, Delete vereist geen overeenkomende aanroep naar Update.

Als voorwaarde voor het aanroepen Deletemoet de recordset kunnen worden bijgewerkt en moet deze op een record staan. De lidfuncties CanUpdate, IsBOF, IsEOF en IsDeleted stellen u in staat deze voorwaarden te bepalen.

Wanneer u belt Delete:

  • Als uw ODBC-stuurprogramma de ::SQLSetPos ODBC-API-functie ondersteunt, gebruikt MFC de functie om de record op de gegevensbron te verwijderen. Het gebruik ::SQLSetPos is meestal efficiënter dan het gebruik van SQL.

    -of-

  • Als ::SQLSetPos niet kan worden gebruikt, doet MFC het volgende:

    1. Er wordt geen back-up gemaakt van de huidige record in de bewerkingsbuffer, zoals in AddNew en Edit.

    2. Delete maakt een SQL DELETE-instructie waarmee de record wordt verwijderd.

      De huidige record in de bewerkingsbuffer wordt niet opgeslagen als in AddNew en Edit.

    3. Delete voert de verwijdering door. Hiermee wordt de DELETE-instructie uitgevoerd. De record wordt gemarkeerd als verwijderd op de gegevensbron en, als de record een momentopname is, in ODBC.

    4. De waarden van de verwijderde record bevinden zich nog steeds in de veldgegevensleden van de recordset, maar de veldgegevensleden zijn gemarkeerd als Null en de lidfunctie van IsDeleted de recordset retourneert een niet-nulwaarde.

    Opmerking

    Nadat u een record hebt gewist, moet u naar een andere record schuiven om de bewerkingsbuffer opnieuw te vullen met de gegevens van de nieuwe record. Het is een fout om Delete opnieuw aan te roepen of Edit aan te roepen.

Zie SQL voor informatie over de SQL-instructies die worden gebruikt in updatebewerkingen.

Zie ook

Recordset (ODBC)
Recordset: Meer informatie over updates (ODBC)
Record Field Exchange (RFX)