Aktualizacja wierszy
Operacja bardzo podstawowej bazy danych jest aktualizacji lub zapisać danych do magazynu danych.W OLE DB, mechanizm aktualizacji jest prosty: aplikacja konsumenta ustawia wartości elementów dane powiązane i następnie zapisuje te wartości do wierszy; następnie konsument żąda, że dostawca aktualizacji magazynu danych.
Konsumentów na wierszy danych, można wykonywać następujące rodzaje aktualizacji: Ustawianie wartości kolumny w wierszu wstawiania wiersza i usuwanie wiersza.Do wykonania tych operacji klasy OLE DB szablonu CRowset implementuje IRowsetChange interfejs i zastępuje następujące metody interfejsu:
SetData zmienia wartości kolumny w wierszu zestawu wierszy; jest odpowiednikiem polecenia SQL UPDATE.
Wstawianie wstawia wiersz do wierszy; jest odpowiednikiem polecenia SQL INSERT.
Usuwanie usuwa wiersze z zestawu wierszy; jest odpowiednikiem polecenia SQL DELETE.
Wspieranie operacji aktualizacji
Po utworzeniu konsumenta z ATL OLE DB konsumenta kreatora może obsługiwać operacje aktualizacji, zaznaczając jeden lub więcej z trzech pól wyboru zmiany, wstawić, i usunąć.Wybranie tych Kreator modyfikuje kod odpowiednio do obsługi typ zmian, możesz wybrać.Jednakże, jeśli nie używasz kreatora, należy ustawić następujące właściwości wierszy VARIANT_TRUE do obsługi aktualizacji:
DBPROPVAL_UP_CHANGE pozwala na zmianę wartości danych w wierszu.
DBPROPVAL_UP_INSERT umożliwia wstawianie wierszy.
DBPROPVAL_UP_DELETE umożliwia usuwanie wiersza.
Ustaw właściwości w następujący sposób:
CDBPropSet ps(DBPROPSET_ROWSET);
ps.AddProperty(DBPROP_IRowsetChange, true)
ps.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE)
Zmiana, Wstaw lub operacje usuwania może się nie powieść, jeśli jedna lub więcej kolumn nie jest zapisywalny.Modyfikowanie mapy kursor, aby rozwiązać ten problem.
Ustawianie danych w wierszach
CRowset::SetData ustawia wartości danych w jednej lub kilku kolumn bieżącego wiersza.Poniższy kod ustawia wartości elementów danych powiązane z kolumn "Nazwa" i "Jednostki w Stock" z tabeli Produkty, a następnie wywołuje SetData do zapisu tych wartości 100 wierszy zestawu wierszy:
// Instantiate a rowset based on the user record class
CTable<CAccessor<CProductAccessor> > product;
CSession session;
// Open the rowset and move to the 100th row
product.Open(session, "Product", &ps, 1); // ps is the property set
product.MoveToBookmark(&bookmark, 0); // Assume that bookmark is set to 100th row
// Change the values of columns "Name" and "Units in Stock" in the current row of the Product table
_tcscpy_s( product.m_ProductName, product.m_sizeOfProductName,
_T( "Candle" ) );
product.m_UnitsInStock = 10000;
// Set the data
HRESULT hr = product.SetData( );
Wstawianie wierszy do wierszy
CRowset::Insert tworzy i inicjuje nowego wiersza przy użyciu danych z akcesor.Wstawianie tworzy całkowicie nowy wiersz po bieżącym wierszu; należy określić, czy zwiększenie bieżącego wiersza do następnego wiersza lub pozostawić je bez zmian.Można to zrobić, ustawiając bGetRow parametru:
HRESULT Insert(int nAccessor = 0, bool bGetRow = false)
FALSE (wartość domyślna) określa, że bieżący wiersz przyrost wartości do następnego wiersza (w takim przypadku wskazuje wstawionego wiersza).
TRUE Określa bieżący wiersz pozostaje, gdzie jest.
Poniższy kod ustawia wartości elementów danych powiązane z kolumny w tabeli Produkty, a następnie wywołuje wstawić , aby wstawić nowy wiersz z tych wartości po 100 wierszy zestawu wierszy.Zalecane jest, aby ustawić wszystkie wartości w kolumnie uniknąć Niezdefiniowany danych do nowego wiersza:
// Instantiate a rowset based on the user record class
CTable<CAccessor<CProductAccessor> > product;
CSession session;
// Open the rowset and move to the 100th row
product.Open(session, "Product", &ps, 1); // ps is the property set
product.MoveToBookmark(&bookmark, 0); // Assume that bookmark is set to 100th row
// Set the column values for a row of the Product table, then insert the row
product.m_ProductID = 101;
_tcscpy_s( product.m_ProductName, product.m_sizeOfProductName,
_T( "Candle" ) );
product.m_SupplierID = 27857;
product.m_CategoryID = 372;
_tcscpy_s( product.m_QuantityPerUnit, product.m_sizeOfQuantityPerUnit,
_T( "Pack of 10" ) );
product.m_UnitPrice = 20;
product.m_UnitsInStock = 10000;
product.m_UnitsOnOrder = 5201;
product.m_ReorderLevel = 5000;
product.m_Discontinued = false;
// You must also initialize the status and length fields before setting/inserting data
// Set the column status values
m_dwProductIDStatus = DBSTATUS_S_OK;
m_dwProductNameStatus = DBSTATUS_S_OK;
m_dwSupplierIDStatus = DBSTATUS_S_OK;
m_dwCategoryIDStatus = DBSTATUS_S_OK;
m_dwQuantityPerUnitStatus = DBSTATUS_S_OK;
m_dwUnitPriceStatus = DBSTATUS_S_OK;
m_dwUnitsInStockStatus = DBSTATUS_S_OK;
m_dwUnitsOnOrderStatus = DBSTATUS_S_OK;
m_dwReorderLevelStatus = DBSTATUS_S_OK;
m_dwDiscontinuedStatus = DBSTATUS_S_OK;
// Set the column length value for column data members that are not fixed-length types.
// The value should be the length of the string that you are setting.
m_dwProductNameLength = 6; // "Candle" has 6 characters
m_dwQuantityPerUnitLength = 10; // "Pack of 10" has 10 characters
// Insert the data
HRESULT hr = product.Insert( );
Na przykład bardziej szczegółowe, zobacz CRowset::Insert.
Aby uzyskać więcej informacji na temat ustawiania stanu i długość danych członków, zobacz Pole Stan danych członków w akcesorach Wizard-Generated.
Usuwanie wierszy z zestawów wierszy
CRowset::Delete usuwa bieżący wiersz z zestawu wierszy.Następujący kod dodaje do wywołań usunąć do usunięcia setnego wiersza zestawu wierszy:
// Instantiate a rowset based on the user record class
CTable<CAccessor<CProductAccessor> > product;
CSession session;
// Open the rowset and move to the 100th row
product.Open(session, "Product", &ps, 1); // ps is the property set
product.MoveToBookmark(&bookmark, 0); // Assume that bookmark is set to 100th row
// Delete the row
HRESULT hr = product.Delete( );
Natychmiastowe i odroczonego aktualizacje
O ile nie określono inaczej, wzywa do SetData, wstawić, i usunąć metody natychmiast zaktualizować magazynu danych.Aktualizacje mogą jednakże odroczyć, tak aby konsument przechowuje wszystkie zmiany w lokalnej pamięci podręcznej i przesyła je do magazynu danych podczas wywołania jednej z następujących metod aktualizacji:
CRowset::Update przenosi żadnych oczekujących zmian dokonanych od ostatniego pobrania bieżącego wiersza lub Aktualizacja wzywają go.
CRowset::UpdateAll przenosi żadnych oczekujących zmian dokonanych od ostatniego pobrania wszystkich wierszy lub Aktualizacja wzywają go.
Uwaga tej aktualizacji, jak używana przez metody aktualizacji, ma szczególne znaczenie wprowadzanie zmian na polecenie i nie powinien być mylone z polecenia SQL UPDATE (SetData jest odpowiednikiem polecenia SQL UPDATE).
Odroczone aktualizacje są przydatne na przykład w sytuacjach, takich jak serii transakcji bankowych; Jeśli jedna transakcja została anulowana, można cofnąć zmiany, ponieważ nie należy wysyłać serię zmian, aż po ostatnia jest zaangażowana.Także dostawca może zawierać zmiany do wywołania jednej sieci, jest bardziej efektywne.
Do obsługi odroczonego aktualizacji, należy ustawić DBPROP_IRowsetChange właściwość oprócz właściwości opisane w "Wspieranie operacji aktualizacji":
pPropSet->AddProperty(DBPROP_IRowsetUpdate, true);
Po wywołaniu Aktualizacja lub UpdateAll, metod przesyłania zmian z lokalnej pamięci podręcznej do magazynu danych i następnie użytkujący lokalnej pamięci podręcznej.Ponieważ aktualizacja przenosi zmiany tylko dla bieżącego wiersza, jest ważne, że aplikacja zachować o którym wiersz do aktualizacji i kiedy należy go zaktualizować.Jak zaktualizować dwóch kolejnych wierszy można znaleźć w poniższym przykładzie:
// Instantiate a rowset based on the user record class
CTable<CAccessor<CProductAccessor> > product;
CSession session;
// Open the rowset and move to the 100th row
product.Open(session, "Product", &ps, 1); // ps is the property set
product.MoveToBookmark(&bookmark, 0); // Assume that bookmark is set to 100th row
// Change the values of columns "Name" and "Units in Stock" in the 100th row of the Product table
_tcscpy_s( product.m_ProductName, product.m_sizeOfProductName,
_T( "Wick" ) );
product.m_UnitsInStock = 10000;
HRESULT hr = product.SetData( ); // No changes made to row 100 yet
product.Update(); // Update row 100 now
// Change the values of columns "Name" and "Units in Stock" in the 101st row of the Product table
product.MoveNext( );
_tcscpy_s( product.m_ProductName, product.m_sizeOfProductName
_T( "Wax" ) );
product.m_UnitsInStock = 500;
HRESULT hr = product.SetData( ); // No changes made to row 101 yet
product.Update(); // Update row 101 now
W celu zapewnienia, że do czasu zmiany są przenoszone, powinna wywołać Aktualizacja przed przejściem do następnego wiersza.Jednak po jest niewygodny lub nieskuteczne, na przykład, gdy aplikacja musi zaktualizować setek wierszy, można UpdateAll jednocześnie zaktualizować wszystkie wiersze.
Na przykład jeśli pierwszym Aktualizacja brakowało wywołanie z powyższego kodu, wiersz 100 pozostaje bez zmian, natomiast zmiany wiersza 101.Po tym punkcie, aplikacja musi wywołać UpdateAll lub przenieść z powrotem do wiersza 100 i wywołanie Aktualizacja dla tego wiersza, należy zaktualizować.
Głównym powodem odroczyć zmiany jest ostatecznie, będzie można cofnąć ich.Wywołanie CRowset::Undo wycofuje stanu pamięci podręcznej lokalnej zmiany do stanu magazynu danych przed dowolną oczekujące zmiany zostały wprowadzone.Warto zauważyć, że Cofnij nie wycofa Państwo lokalnej pamięci podręcznej w jednym kroku (stan przed tylko najnowsze zmiany); Zamiast tego czyści lokalnej pamięci podręcznej dla tego wiersza.Ponadto Cofnij dotyczy tylko bieżącego wiersza.