Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet gäller för MFC ODBC-klasserna.
I det här avsnittet förklaras:
Anmärkning
Det här avsnittet gäller för objekt som härleds från CRecordset där massradhämtning inte har implementerats. Om du har implementerat massradhämtning, gäller viss information inte. Du kan till exempel inte anropa AddNewfunktionerna , Edit, Deleteoch Update medlem, men du kan utföra transaktioner. Mer information om masshämtning av rader finns i Recordset: Fetching Records in Bulk (ODBC).
Hur andra åtgärder påverkar uppdateringar
Dina uppdateringar påverkas av pågående transaktioner vid tidpunkten för uppdateringen, genom att stänga postuppsättningen innan du slutför en transaktion, och genom att bläddra innan du slutför en transaktion.
Så här påverkar transaktioner uppdateringar
Förutom att förstå hur AddNew, Editoch Delete fungerar är det viktigt att förstå hur BeginTransfunktionerna , CommitTransoch Rollback medlem i CDatabase fungerar med uppdateringsfunktionerna i CRecordset.
Som standard påverkar anrop till AddNew och Edit datakällan omedelbart när du anropar Update.
Delete anrop träder omedelbart i kraft. Men du kan upprätta en transaktion och köra en batch med sådana anrop. Uppdateringarna är inte permanenta förrän de commitas. Om du ändrar dig kan du återställa transaktionen i stället för att genomföra den.
Mer information om transaktioner finns i Transaktion (ODBC).
Hur stängning av postuppsättningen påverkar uppdateringar
Om du stänger en postuppsättning, eller dess associerade CDatabase objekt, med en pågående transaktion (du har inte kallat CDatabase::CommitTrans eller CDatabase::Rollback) återställs transaktionen automatiskt (såvida inte databasserverdelen är Microsoft Jet-databasmotorn).
Försiktighet
Om du använder Microsoft Jet-databasmotorn, leder stängningen av en postuppsättning inom en explicit transaktion inte till att någon av raderna som har ändrats släpps eller att lås som har placerats släpps förrän den explicita transaktionen har bekräftats eller återställts. Vi rekommenderar att du alltid både öppnar och stänger postuppsättningar i eller utanför en explicit Jet-transaktion.
Hur rullning påverkar uppdateringar
När du registrerar: Rullning (ODBC) i en postuppsättning fylls redigeringsbufferten med varje ny aktuell post (den tidigare posten lagras inte först). Skrollning hoppar över de poster som tidigare tagits bort. Om du bläddrar efter ett AddNew eller Edit anrop utan att anropa Update, CommitTranseller Rollback först går alla ändringar förlorade (utan varning till dig) när en ny post tas med i redigeringsbufferten. Redigeringsbufferten fylls med den valda posten, den lagrade posten frigörs och ingen ändring sker i datakällan. Detta gäller både AddNew och Edit.
Dina uppdateringar och uppdateringar av andra användare
När du använder en postuppsättning för att uppdatera data påverkar dina uppdateringar andra användare. På samma sätt påverkar uppdateringarna av andra användare under livslängden för din postuppsättning dig.
I en miljö med flera användare kan andra användare öppna postuppsättningar som innehåller några av de poster du har valt i dina postuppsättningar. Ändringar i en post innan du hämtar den återspeglas i postuppsättningen. Eftersom dynasets hämtar en post varje gång du bläddrar till den återspeglar dynasets ändringar varje gång du bläddrar till en post. Ögonblicksbilder hämtar en post första gången du scrollar till den, så ögonblicksbilder återspeglar bara de ändringar som sker innan du ursprungligen scrollar till posten.
Poster som lagts till av andra användare när du har öppnat postuppsättningen visas inte i postuppsättningen om du inte gör en ny förfrågan. Om din postuppsättning är en dynaset visas ändringar i befintliga poster av andra användare i din dynaset när du bläddrar till den berörda posten. Om postuppsättningen är en ögonblicksbild visas inte redigeringar förrän du har frågat om ögonblicksbilden. Om du vill se poster som lagts till eller tagits bort av andra användare i ögonblicksbilden, eller poster som andra användare har lagt till i din dynaset, anropar du CRecordset::Requery för att återskapa postuppsättningen. (Observera att borttagningarna av andra användare visas i din dynaset.) Du kan också anropa Requery för att se poster som du lägger till, men inte för att se dina borttagningar.
Tips/Råd
Om du vill framtvinga cachelagring av en hel ögonblicksbild samtidigt anropar MoveLast du omedelbart när du har öppnat ögonblicksbilden. Anropa MoveFirst för att börja arbeta med registren.
MoveLast motsvarar att bläddra genom alla poster, men hämtar alla på en gång. Observera dock att detta kan sänka prestanda och kanske inte krävs för vissa drivrutiner.
Effekterna av dina uppdateringar på andra användare liknar deras effekter på dig.
Mer om uppdatering och borttagning
Det här avsnittet innehåller ytterligare information som hjälper dig att arbeta med Update och Delete.
Uppdateringsframgång och misslyckande
Om Update lyckas avslutas AddNew- eller Edit-läget. Om du vill starta ett AddNew-läge eller Edit-läge igen, anropar du AddNew eller Edit.
Om Update misslyckas (returnerar FALSE eller utlöser ett undantag) förblir du i AddNew eller Edit läge, beroende på vilken funktion du anropade sist. Du kan sedan göra något av följande:
Ändra en fältdatamedlem och försök
Updateigen.Anropa
AddNewför att återställa fältdatamedlemmarna till Null, ange värdena för fältdatamedlemmarna och anropaUpdatesedan igen.Anropa
Editför att läsa in värdena som fanns i postuppsättningen före det första anropet tillAddNewellerEdit, ange värdena för fältdatamedlemmarna och anropaUpdatesedan igen. Efter ett lyckatUpdateanrop (förutom efter ettAddNewanrop) behåller fältdatamedlemmarna sina nya värden.Anropa
Move(inklusiveMovemed en parameter av AFX_MOVE_REFRESH, eller 0), vilket spolar eventuella ändringar och avslutar allaAddNew- ellerEdit-lägen som är aktiva.
Uppdatera och ta bort
Det här avsnittet gäller både Update och Delete.
Vid en Update- eller Delete-åtgärd bör en och endast en post uppdateras. Posten är den aktuella posten, som motsvarar datavärdena i fälten i postuppsättningen. Om inga poster av någon anledning påverkas eller om fler än en post påverkas genereras ett undantag som innehåller något av följande RETCODE-värden :
AFX_SQL_FEL_INGA_RADER_PÅVERKADE
AFX_SQL_ERROR_FLERA_RADER_PÅVERKADE
När dessa undantag utlöses förblir du i det AddNew eller-tillstånd Edit som du befann dig i när du anropade Update eller Delete. Här är de vanligaste scenarierna där du skulle se dessa undantag. Det är mest troligt att du ser:
AFX_SQL_ERROR_NO_ROWS_AFFECTED när du använder optimistiskt låsläge och en annan användare har ändrat posten på ett sätt som hindrar ramverket från att identifiera rätt post att uppdatera eller ta bort.
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED när tabellen du uppdaterar inte har någon primärnyckel eller ett unikt index och du inte har tillräckligt med kolumner i postuppsättningen för att unikt identifiera en tabellrad.
Se även
Postuppsättning (ODBC)
Postuppsättning: Hur poster väljs i postuppsättningar (ODBC)
Postfältutbyte (RFX)
SQL
Undantag: Databasundantag