Recordset: Meer informatie over updates (ODBC)

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

In dit onderwerp wordt uitgelegd:

Opmerking

Dit onderwerp is van toepassing op objecten die zijn afgeleid van CRecordset waaruit bulksgewijs ophalen van rijen niet is geïmplementeerd. Als u bulksgewijs ophalen van rijen hebt geïmplementeerd, is een deel van de informatie niet van toepassing. U kunt bijvoorbeeld de lidfuncties AddNew, Edit, Delete en Update niet aanroepen; u kunt echter wel transacties uitvoeren. Zie Recordset: Records in Bulk Ophalen (ODBC) voor meer informatie over het ophalen van rijen in bulk.

Invloed van andere bewerkingen op updates

Uw updates worden beïnvloed door transacties die van kracht zijn op het moment van de update, door de recordset te sluiten voordat u een transactie voltooit en door te schuiven voordat u een transactie voltooit.

Hoe transacties van invloed zijn op updates

Buiten het begrijpen van hoe AddNew, Edit en Delete werken, is het belangrijk om te begrijpen hoe de lidfuncties BeginTrans, CommitTrans en Rollback van CDatabase werken met de updatefuncties van CRecordset.

Standaard zullen aanroepen van AddNew en Edit de gegevensbron onmiddellijk beïnvloeden wanneer u Update aanroept. Delete oproepen worden onmiddellijk van kracht. Maar u kunt een transactie tot stand brengen en een batch met dergelijke aanroepen uitvoeren. De updates zijn pas permanent als u ze doorvoert. Als u van gedachten verandert, kunt u de transactie terugdraaien in plaats van deze vast te leggen.

Zie Transaction (ODBC) voor meer informatie over transacties.

Hoe het sluiten van de recordset van invloed is op updates

Als u een recordset of het bijbehorende CDatabase object sluit, met een transactie die wordt uitgevoerd (u hebt geen CDatabase::CommitTrans of CDatabase::Rollback genoemd), wordt de transactie automatisch teruggedraaid (tenzij uw databaseback-end de Microsoft Jet-database-engine is).

Waarschuwing

Als u de Microsoft Jet-database-engine gebruikt, resulteert het sluiten van een recordset in een expliciete transactie niet in het vrijgeven van een van de rijen die zijn gewijzigd of vergrendeld die zijn geplaatst totdat de expliciete transactie is doorgevoerd of teruggedraaid. Het wordt aanbevolen om recordsets altijd binnen of buiten een expliciete Jet-transactie te openen en te sluiten.

Hoe schuiven van invloed is op updates

Wanneer u Recordset: Schuiven (ODBC) in een recordset, wordt de bewerkingsbuffer gevuld met elke nieuwe huidige record (de vorige record wordt niet eerst opgeslagen). Bij het scrollen worden eerder verwijderde records overgeslagen. Als u na een AddNew-oproep naar beneden scrolt zonder eerst Edit, Update of CommitTrans aan te roepen, gaan eventuele wijzigingen verloren (zonder dat u wordt gewaarschuwd) omdat een nieuw record in de bewerkingsbuffer wordt geladen. De bewerkingsbuffer wordt gevuld met de record waarnaar is gescrold, de opgeslagen record wordt vrijgegeven en de gegevensbron wordt niet gewijzigd. Dit geldt voor zowel AddNew als Edit.

Uw updates en de updates van andere gebruikers

Wanneer u een recordset gebruikt om gegevens bij te werken, zijn uw updates van invloed op andere gebruikers. Op dezelfde manier hebben de updates van andere gebruikers tijdens de levensduur van uw recordset invloed op u.

In een omgeving met meerdere gebruikers kunnen andere gebruikers recordsets openen die enkele van dezelfde records bevatten die u in uw recordset hebt geselecteerd. Wijzigingen in een record voordat u deze ophaalt, worden doorgevoerd in uw recordset. Omdat dynasets elke keer dat u naar een record schuift, een record ophalen, geven dynasets wijzigingen weer telkens wanneer u naar een record schuift. Momentopnamen halen een record op wanneer u voor het eerst naar de record schuift, zodat momentopnamen alleen de wijzigingen weerspiegelen die zich voordoen voordat u in eerste instantie naar de record schuift.

Records die door andere gebruikers zijn toegevoegd nadat u de recordset hebt geopend, worden niet weergegeven in de recordset, tenzij u de query opnieuw uitvoert. Als uw recordset een dynaset is, worden wijzigingen in bestaande records door andere gebruikers weergegeven in uw dynaset wanneer u naar de betreffende record schuift. Als uw recordset een momentopname is, worden bewerkingen pas weergegeven wanneer u de momentopname opnieuw opgeeft. Als u records wilt zien die zijn toegevoegd aan of verwijderd door andere gebruikers in uw momentopname of records die zijn toegevoegd door andere gebruikers in uw dynaset, roept u CRecordset::Requery aan om de recordset opnieuw te bouwen. (Houd er rekening mee dat de verwijderingen van andere gebruikers worden weergegeven in uw dynaset.) U kunt ook aanroepen Requery om records te zien die u toevoegt, maar niet om uw verwijderingen te zien.

Aanbeveling

Als u het opslaan van een volledige momentopname in één keer wilt afdwingen, roept MoveLast u onmiddellijk na het openen van de momentopname aan. Roep MoveFirst vervolgens aan om te beginnen met de verwerking van de records. MoveLast is gelijk aan het schuiven over alle records, maar haalt ze allemaal tegelijk op. Houd er echter rekening mee dat dit de prestaties kan verlagen en mogelijk niet vereist is voor sommige stuurprogramma's.

De effecten van uw updates op andere gebruikers zijn vergelijkbaar met hun gevolgen voor u.

Meer informatie over bijwerken en verwijderen

Deze sectie bevat aanvullende informatie om u te helpen bij het werken met Update en Delete.

Geslaagde en mislukte updates

Als Update dit lukt, eindigt de AddNew of Edit modus. Als u een AddNew of Edit modus opnieuw wilt starten, belt u AddNew of Edit.

Als Update dit mislukt (retourneert ONWAAR of een uitzondering genereert), blijft u in AddNew of Edit modus, afhankelijk van welke functie u het laatst hebt aangeroepen. U kunt vervolgens een van de volgende handelingen uitvoeren:

  • Wijzig een veldgegevenslid en probeer het Update opnieuw.

  • Roep AddNew aan om de veldgegevensleden opnieuw in te stellen op null, stel de waarden van de veldgegevensleden in, en roep vervolgens Update opnieuw aan.

  • Roep Edit aan om de waarden in de recordset opnieuw te laden vóór de eerste aanroep naar AddNew of Edit, stel de waarden van de veldgegevensleden in en roep vervolgens opnieuw aan Update . Na een geslaagde Update aanroep (behalve na een AddNew aanroep) behouden de leden van de veldgegevens hun nieuwe waarden.

  • Aanroep Move (inclusief Move met een parameter van AFX_MOVE_REFRESH of 0), waarmee wijzigingen worden doorgevoerd en elke actieve AddNew- of Edit-modus wordt beëindigd.

Bijwerken en verwijderen

Deze sectie is van toepassing op zowel Update als Delete.

Op een Update of Delete bewerking moet één en slechts één record worden bijgewerkt. Dit record is het huidige record, dat overeenkomt met de gegevens in de velden van de recordset. Als er om een of andere reden geen records worden beïnvloed of als er meer dan één record wordt beïnvloed, wordt er een uitzondering gegenereerd die een van de volgende RETCODE-waarden bevat:

  • SQL-fout: geen rijen beïnvloed

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED

Wanneer deze uitzonderingen worden opgeworpen, blijft u in de AddNew of Edit toestand waarin u was toen u Update of Delete aanriep. Hier volgen de meest voorkomende scenario's waarin u deze uitzonderingen zou zien. Waarschijnlijk ziet u het volgende:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED wanneer u de optimistische vergrendelingsmodus gebruikt en een andere gebruiker de records zodanig heeft gewijzigd dat het framework de juiste records niet kan identificeren om bij te werken of te verwijderen.

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED wanneer de tabel die u bijwerkt geen primaire sleutel of unieke index heeft en u niet voldoende kolommen in de recordset hebt om een tabelrij uniek te identificeren.

Zie ook

Recordset (ODBC)
Recordset: Hoe Recordsets Records Selecteren (ODBC)
Record Field Exchange (RFX)
SQL
Uitzonderingen: Database-uitzonderingen