Aktualizowanie zestawów wierszy

Operacja bardzo podstawowej bazy danych jest do aktualizacji lub zapisać danych do magazynu danych.W OLE DB, jest prosty mechanizm aktualizacji: aplikacji konsumenta ustawia wartości składników dane powiązane, a następnie zapisuje te wartości do wierszy; następnie konsument żąda, aby dostawca aktualizacji magazynu danych.

Konsumenci mogą wykonywać następujące rodzaje aktualizacji na zestaw wierszy danych: Ustawianie wartości kolumn w wierszu, wstawiania wiersza i usuwanie wiersza.Do wykonania tych operacji OLE DB szablonu klasy CRowset implementuje IRowsetChange interfejs i zastępuje następujące metody interfejsu:

  • SetData zmiany wartości kolumny w wierszu wierszy; jest odpowiednikiem polecenia SQL UPDATE.

  • Wstaw wstawia wiersz do wierszy; jest odpowiednikiem polecenia SQL INSERT.

  • Usuwanie usuwa wiersze z zestawu wierszy; jest odpowiednikiem polecenia SQL DELETE.

Wspieranie operacji aktualizowania

Po utworzeniu konsumenta przy użyciu biblioteki ATL OLE DB konsumenta kreatora może obsługiwać operacje aktualizacji, wybierając jedną lub więcej z trzech pól wyboru zmiany, Wstaw, i usunąć.Wybranie tych Kreator modyfikuje kod odpowiednio do obsługi typ zmian, którą wybierzesz.Jednakże, jeśli nie należy używać 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 pozwala wstawić nowy wiersz.

  • DBPROPVAL_UP_DELETE pozwala na 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.

Ustawienia 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 członkowskich danych powiązane kolumny "Nazwa" i "Jednostek w magazynie" z tabeli Produkty, a następnie wywołuje SetData zapisać te wartości do 100-wiersz 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.Wstaw tworzy całkowicie nowy wiersz po bieżącym wierszu; należy określić, czy przyrost bieżącego wiersza do następnego wiersza lub pozostawić go bez zmian.Można to zrobić przez ustawienie bGetRow parametr:

HRESULT Insert(int nAccessor = 0, bool bGetRow = false)
  • fałszywe (wartość domyślna) określa, czy bieżący wiersz licznika kliknię cia do następnego wiersza (w tym przypadku wskazuje na wstawionego wiersza).

  • TRUE Określa, czy bieżący wiersz pozostają, gdzie jest.

Poniższy kod ustawia wartości elementów członkowskich danych powiązane kolumny w tabeli Produkty, a następnie wywołuje Wstaw Aby wstawić nowy wiersz z tymi wartościami po 100-wiersz zestawu wierszy.Zalecane jest, aby ustawić wszystkie wartości kolumny, aby 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 dotyczących 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.Poniższy kod wywoła usunąć do usunięcia wiersza 100-zestaw 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

Jeśli użytkownik nie określi inaczej, wzywa do SetData, Wstaw, i usunąć metody natychmiast zaktualizować magazynu danych.Aktualizacje mogą jednakże odroczyć, tak aby konsument wszystkie zmiany są przechowywane 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 transferów wszelkie oczekujące zmiany wprowadzone od czasu ostatniego pobrania bieżącego wiersza lub Aktualizacja zadzwonić na nim.

  • CRowset::UpdateAll transferów wszelkie oczekujące zmiany wprowadzone od czasu ostatniego pobrania wszystkich wierszy lub Aktualizacja zadzwonić na nim.

Uwaga tej aktualizacji, jak używana przez metody aktualizacji, ma szczególne znaczenie wprowadzanie zmian na polecenia i nie należy mylić z polecenia SQL UPDATE (SetData jest odpowiednikiem polecenia SQL UPDATE).

Odroczone aktualizacje są przydatne na przykład w sytuacjach, takich jak seria transakcji bankowych; Jeśli jedna transakcja została anulowana, można cofnąć zmiany, ponieważ nie wysyłaj serię zmian do czasu po ostatnim jest zaangażowana.Dostawca można ponadto pakiet zmian do wywołania jednej sieci, który jest bardziej wydajne.

Do obsługi odroczonego aktualizacji, należy ustawić DBPROP_IRowsetChange właściwość oprócz właściwości opisane w "Wspieranie operacje aktualizacji":

   pPropSet->AddProperty(DBPROP_IRowsetUpdate, true);

Gdy wywołanie Aktualizacja lub UpdateAll, metody przesyłać zmiany z lokalnej pamięci podręcznej do magazynu danych i następnie wymazać 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ć.Poniższy przykład pokazuje sposób aktualizowania dwóch kolejnych 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 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 oczekujące zmiany są przenoszone, powinna wywołać Aktualizacja przed przejściem do kolejnego wiersza.Jednakże, gdy jest niewygodny lub nieskuteczne, na przykład, gdy aplikacja musi zaktualizować setki wierszy, służy UpdateAll jednocześnie zaktualizować wszystkie wiersze.

Na przykład jeśli pierwszy Aktualizacja wywołanie brakowało powyższy kod, rzędu 100 pozostaną niezmienione, podczas gdy zmiany w wierszu 101.Po tym punkcie, aplikacja musi wywołać UpdateAll lub przenieść z powrotem do wiersza 100 i wywołanie Aktualizacja dla tego wiersza do aktualizacji.

Wreszcie jeden główny powód, aby odroczyć zmiany jest aby można było je cofnąć.Wywołanie CRowset::Undo wycofuje stanu Bufor zmian lokalnych do stanu magazynu danych przed żadnych oczekujących zmian zostały wykonane.Ważne jest, aby pamiętać, że Cofnij nie wycofa stanu lokalnej pamięci podręcznej o jeden krok (stanu sprzed ostatniej zmiany); Zamiast tego czyści lokalnej pamięci podręcznej dla tego wiersza.Ponadto Cofnij dotyczy tylko bieżącego wiersza.

Zobacz też

Informacje

Praca z szablonami konsumentów OLE DB

Klasa CRowset

IRowsetChange