Zestaw rekordów: więcej informacji o aktualizacjach (ODBC)
Ten temat dotyczy klas MFC ODBC.
W tym temacie opisano:
Wpływ innych operacji, takich jak transakcje, na aktualizacje.
Więcej informacji na temat funkcji elementów członkowskich Update and Delete.
Uwaga
Ten temat dotyczy obiektów pochodnych, CRecordset
z których pobieranie wierszy zbiorczych nie zostało zaimplementowane. Jeśli zaimplementowano pobieranie wierszy zbiorczych, niektóre informacje nie mają zastosowania. Na przykład nie można wywołać funkcji składowych AddNew
, Edit
, Delete
i Update
, jednak można wykonywać transakcje. Aby uzyskać więcej informacji na temat zbiorczego pobierania wierszy, zobacz Zestaw rekordów: pobieranie rekordów zbiorczo (ODBC).
Jak inne operacje wpływają na aktualizacje
Aktualizacje mają wpływ na transakcje w czasie aktualizacji, zamykając zestaw rekordów przed ukończeniem transakcji, a następnie przewijając przed ukończeniem transakcji.
Jak transakcje wpływają na aktualizacje
Poza zrozumieniem, jak , i działa, ważne jest, aby zrozumieć, jak BeginTrans
funkcje , CommitTrans
i Rollback
składowe bazy danych CDatabase działają z funkcjami aktualizacji CRecordset.Delete
Edit
AddNew
Domyślnie wywołuje metodę AddNew
i Edit
wpływa na źródło danych natychmiast po wywołaniu metody Update
. Delete
wywołania zaczęły obowiązywać natychmiast. Można jednak ustanowić transakcję i wykonać partię takich wywołań. Aktualizacje nie są trwałe do momentu ich zatwierdzenia. Jeśli zmienisz zdanie, możesz wycofać transakcję zamiast jej zatwierdzać.
Aby uzyskać więcej informacji na temat transakcji, zobacz Transaction (ODBC).
Jak zamykanie zestawu rekordów wpływa na aktualizacje
Jeśli zamkniesz zestaw rekordów lub skojarzony z CDatabase
nim obiekt z transakcją w toku (nie masz nazwy CDatabase::CommitTrans lub CDatabase::Rollback), transakcja zostanie wycofana automatycznie (chyba że zaplecze bazy danych jest aparatem bazy danych Microsoft Jet).
Uwaga
Jeśli używasz aparatu bazy danych Microsoft Jet, zamknięcie zestawu rekordów wewnątrz jawnej transakcji nie spowoduje zwolnienia żadnych wierszy, które zostały zmodyfikowane lub zablokowane, dopóki jawna transakcja nie zostanie zatwierdzona lub wycofana. Zaleca się, aby zawsze otwierać i zamykać zestawy rekordów wewnątrz lub poza jawną transakcją Jet.
Jak przewijanie wpływa na aktualizacje
Gdy zestaw rekordów: przewijanie (ODBC) w zestawie rekordów, bufor edycji jest wypełniany przy użyciu każdego nowego bieżącego rekordu (poprzedni rekord nie jest przechowywany jako pierwszy). Przewijanie pomija wcześniej usunięte rekordy. Jeśli przewiniesz po AddNew
wywołaniu metody lub Edit
bez wywołania Update
metody , CommitTrans
lub Rollback
najpierw wszelkie zmiany zostaną utracone (bez ostrzeżenia), ponieważ nowy rekord zostanie przeniesiony do buforu edycji. Bufor edycji jest wypełniony przewiniętym rekordem, przechowywany rekord jest zwalniany i nie ma żadnych zmian w źródle danych. Dotyczy to zarówno elementów , jak AddNew
i Edit
.
Aktualizacje i aktualizacje innych użytkowników
Gdy używasz zestawu rekordów do aktualizowania danych, aktualizacje wpływają na innych użytkowników. Podobnie aktualizacje innych użytkowników w okresie istnienia zestawu rekordów wpływają na Ciebie.
W środowisku wieloużytkownikowym inni użytkownicy mogą otwierać zestawy rekordów zawierające niektóre z tych samych rekordów, które zostały wybrane w zestawie rekordów. Zmiany w rekordzie przed pobraniem zostaną odzwierciedlone w zestawie rekordów. Ponieważ dynamiczne zestawy pobierają rekord za każdym razem, gdy się do niego przewijasz, dynamiczne zestawy odzwierciedlają zmiany za każdym razem, gdy przewijasz rekord. Migawki pobierają rekord po raz pierwszy przewijając go, więc migawki odzwierciedlają tylko te zmiany, które występują przed początkowym przewinięciem do rekordu.
Rekordy dodane przez innych użytkowników po otwarciu zestawu rekordów nie są wyświetlane w zestawie rekordów, chyba że ponownie wykonasz zapytanie. Jeśli zestaw rekordów jest zestawem dynamicznym, zmiany istniejących rekordów przez innych użytkowników są wyświetlane w dynamicznym zestawie po przewinięciu do rekordu, którego dotyczy problem. Jeśli zestaw rekordów jest migawką, edycje nie są wyświetlane do momentu ponownego zarejestrowania migawki. Jeśli chcesz wyświetlić rekordy dodane lub usunięte przez innych użytkowników w migawce albo rekordy dodane przez innych użytkowników w zestawie dynamicznym, wywołaj metodę CRecordset::Requery , aby ponownie skompilować zestaw rekordów. (Należy pamiętać, że usunięcia innych użytkowników są wyświetlane w dynamicznym zestawie). Możesz również wywołać metodę Requery
, aby wyświetlić dodane rekordy, ale nie zobaczyć usunięcia.
Napiwek
Aby wymusić buforowanie całej migawki jednocześnie, wywołaj metodę MoveLast
natychmiast po otwarciu migawki. Następnie wywołaj metodę MoveFirst
, aby rozpocząć pracę z rekordami. MoveLast
jest odpowiednikiem przewijania wszystkich rekordów, ale pobiera je jednocześnie. Należy jednak pamiętać, że może to obniżyć wydajność i może nie być wymagane dla niektórych sterowników.
Wpływ aktualizacji na innych użytkowników jest podobny do ich wpływu na Ciebie.
Więcej informacji na temat aktualizacji i usuwania
Ta sekcja zawiera dodatkowe informacje ułatwiające pracę z elementami Update
i Delete
.
Powodzenie i niepowodzenie aktualizacji
Jeśli Update
zakończy się powodzeniem, AddNew
tryb lub Edit
zakończy się. Aby ponownie rozpocząć tryb lub, wywołaj metodę AddNew
AddNew
lub Edit
.Edit
Jeśli Update
niepowodzenie (zwraca wartość FALSE lub zgłasza wyjątek), pozostaniesz w AddNew
trybie lub Edit
w zależności od funkcji, która jest wywoływana jako ostatnia. Następnie możesz wykonać jedną z następujących czynności:
Zmodyfikuj składową danych pola i spróbuj
Update
ponownie.Wywołaj metodę
AddNew
, aby zresetować składowe danych pól na wartość Null, ustawić wartości elementów członkowskich danych pola, a następnie wywołaćUpdate
ponownie.Wywołaj metodę
Edit
, aby ponownie załadować wartości, które znajdowały się w zestawie rekordów przed pierwszym wywołaniem elementuAddNew
lubEdit
, ustaw wartości składowych danych pola, a następnie wywołajUpdate
ponownie. Po pomyślnymUpdate
wywołaniu (z wyjątkiem wywołaniaAddNew
) składowe danych pól zachowują nowe wartości.Wywołanie
Move
(w tymMove
z parametrem AFX_MOVE_REFRESH lub 0), które opróżnia wszelkie zmiany i kończy działanie dowolnegoAddNew
trybu lubEdit
.
Aktualizowanie i usuwanie
Ta sekcja dotyczy elementów i Update
Delete
.
W przypadku operacji Update
lub Delete
należy zaktualizować tylko jeden rekord. Ten rekord jest bieżącym rekordem, który odpowiada wartościom danych w polach zestawu rekordów. Jeśli z jakiegoś powodu nie ma to wpływu na żadne rekordy lub nie ma to wpływu na więcej niż jeden rekord, zgłaszany jest wyjątek zawierający jedną z następujących wartości RETCODE :
AFX_SQL_ERROR_NO_ROWS_AFFECTED
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED
Gdy te wyjątki zostaną zgłoszone, pozostaniesz w AddNew
stanie lub Edit
, w którym znajdowałeś się podczas wywoływania Update
lub Delete
. Poniżej przedstawiono najbardziej typowe scenariusze, w których można zobaczyć te wyjątki. Najprawdopodobniej zobaczysz:
AFX_SQL_ERROR_NO_ROWS_AFFECTED, gdy używasz optymistycznego trybu blokowania, a inny użytkownik zmodyfikował rekord w sposób uniemożliwiający platformie identyfikację poprawnego rekordu w celu zaktualizowania lub usunięcia.
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED, gdy aktualizowana tabela nie ma klucza podstawowego ani indeksu unikatowego i nie masz wystarczającej liczby kolumn w zestawie rekordów, aby jednoznacznie zidentyfikować wiersz tabeli.
Zobacz też
Zestaw rekordów (ODBC)
Zestaw rekordów: jak zestawy rekordów pobierają rekordy (ODBC)
Wymiana pól rekordów (RFX)
SQL
Wyjątki: wyjątki bazy danych