Udostępnij za pośrednictwem


Zestaw rekordów: więcej informacji o aktualizacjach (ODBC)

Ten temat dotyczy klas MFC ODBC.

W tym temacie opisano:

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, Deletei 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 BeginTransfunkcje , CommitTransi Rollback składowe bazy danych CDatabase działają z funkcjami aktualizacji CRecordset.Delete EditAddNew

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 Updatemetody , CommitTranslub 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 elementu AddNew lub Edit, ustaw wartości składowych danych pola, a następnie wywołaj Update ponownie. Po pomyślnym Update wywołaniu (z wyjątkiem wywołania AddNew ) składowe danych pól zachowują nowe wartości.

  • Wywołanie Move (w tym Move z parametrem AFX_MOVE_REFRESH lub 0), które opróżnia wszelkie zmiany i kończy działanie dowolnego AddNew trybu lub Edit .

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