Aracılığıyla paylaş


Satır Kümelerini Güncelleştirme

Veri deposunu güncelleştirmek veya ona veri eklemek çok basit bir veritabanı işlemidir. OLE DB'de güncelleme mekanizması basittir: tüketici uygulamanız bağlı veri üyeleri değerlerini ayarlar ve sonra bu değerleri satır kümesine yazar; ardından tüketici sağlayıcının veri deposunu güncelleştirmesini önerir.

Tüketiciler satır kümesi üzerinde şu tür veri güncelleştirmelerini gerçekleştirebilir: bir satır içinde sütun değerlerini ayarlama, satır ekleme ve satır silme. Bu işlemleri yerine getirmek için OLE DB Şablon sınıfı CRowset, IRowsetChange arayüzünü uygular ve aşağıdaki arayüz yöntemlerini devre dışı bırakır.

  • SetData, satır kümesinin bir satırındaki sütun sayısı değerini değiştirir; SQL UPDATE komutunun eşdeğeridir.

  • Ekle satır kümesine bir satır ekler; SQL INSERT komutuna eşdeğerdir.

  • Sil bir satır kümesinden satır siler, SQL DELETE komutu ile eş değerdir.

Yükseltme İşlemlerinin Desteklenmesi

ATL OLE DB Tüketici Sihirbazı ile bir tüketici oluştururken Değiştir, Ekle ve Sil onay kutularından birini ya da fazlasını seçerek güncelleme işlemlerini destekleyebilirsiniz. Bunları seçerseniz, sihirbazın seçtiğiniz değişikliklerin türünü desteklemek için kodu uygun şekilde değiştirir. Ancak, sihirbaz kullanmazsanız, güncelleştirmeleri desteklemek için aşağıdaki satır kümesi özelliklerini VARIANT_TRUE olarak ayarlamanız gerekir:

  • DBPROPVAL_UP_CHANGE bir satır üzerindeki veri değerlerin değiştirmenize olanak sağlar.

  • DBPROPVAL_UP_INSERT bir satır eklemenize olanak sağlar.

  • DBPROPVAL_UP_DELETE bir satırı silmenize olanak sağlar.

Özellikleri şu şekilde ayarlayın:

CDBPropSet ps(DBPROPSET_ROWSET);
ps.AddProperty(DBPROP_IRowsetChange, true)
ps.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE)

Bir veya daha fazla sütunun yazılabilir olmaması halinde değiştirme, ekleme veya silme işlemleri gerçekleştirilemeyebilir. İmleç haritanızı bunu düzeltecek şekilde değiştirin.

Satırlardaki Verileri Ayarlama

CRowset::SetData geçerli satır üzerindeki bir veya daha fazla sütunun veri değerlerini ayarlar. Aşağıdaki kod, tablo Ürünlerinin "Ad" ve "Stoktaki Birimler" sütunlarına bağlı veri üyelerinin değerlerini ayarlar ve daha sonra satır kümesinin 100. satırına bu değerleri yazması için SetData öğesini çağırır:

// 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( );

Satır kümelerine Satır Ekleme

CRowset::Insert erişimci verilerini kullanarak yeni bir satır oluşturur ve başlatır. Ekle geçerli satırdan sonra tamamen yeni bir satır oluşturur, geçerli satırın bir sonraki satıra artırılması veya değişmeden bırakılması seçeneklerinden hangisini istediğinizi belirtmeniz gerekir. bGetRow parametresini ayarlayarak bunu yapın:

HRESULT Insert(int nAccessor = 0, bool bGetRow = false)
  • yanlış (varsayılan değer) geçerli satırın sonraki satırı artırdığını belirtir (bu durumda eklenen satırı işaret eder).

  • doğru geçerli satırın olduğu yerde kalacağını belirtir.

Aşağıdaki kod, tablo Ürünlerinin "Ad" ve "Stoktaki Birimler" sütunlarına bağlı veri üyelerinin değerlerini ayarlar ve daha sonra satır kümesinin 100. satırının ardından bu değerlerle yeni bir satır eklemesi için Ekle öğesini çağırır. Yeni satırda tanımsız verileri önlemek için tüm sütun değerlerini ayarlamanız önerilir:

// 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( );

Daha ayrıntılı bir örnek için bkz. CRowset::Insert.

Durum ve uzunluk veri üyeleri ayarları hakkında daha fazla bilgi için bkz. Sihirbazın Ürettiği Erişimcilerde Alan Durumu Veri Üyeleri.

Satır Kümelerinden Satırları Silme

CRowset::Delete satır kümesinden geçerli satırı siler. Aşağıdaki kod, satır kümesinin 100. satırını kaldırmak için Sil öğesini çağırır.

// 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( );

Anında ve Ertelenmiş Güncelleştirmeler

Siz aksini belirtmedikçe,SetData, Ekle ve Sil yöntemlerine yapılan aramalar veri deposunu anında güncelleştirir. Güncelleştirmeleri erteleyebilirsiniz, böylece siz aşağıdaki güncelleştirme yöntemlerinden birini çağırdığınızda tüketici tüm değişiklikleri yerel önbellekte depolar ve sonra da veri deposuna aktarır:

  • CRowset::Update geçerli satır üzerinde yapılan en son getirme veya Güncelleştirme çağrısından itibaren yapılmış olan tüm bekleyen değişiklikleri aktarır.

  • CRowset::UpdateAll tüm satırlar üzerinde yapılan en son getirme veya Güncelleştirme çağrısından itibaren yapılmış olan tüm bekleyen değişiklikleri aktarır.

Güncelleştirme yöntemleri tarafından kullanıldığı şekliyle güncelleştirme, komutta değişiklikler yapma anlamına gelir ve SQL UPDATE komutu ile karıştırılmamalıdır (SetData komutu SQL UPDATE ile eşdeğerdir).

Ertelenen güncelleştirmeler, örneğin bankacılık işlemleri dizisi gibi durumlarda kullanışlıdır; bir işlem iptal edilirse değişikliği geri alabilirsiniz, çünkü değişiklik dizilerini en son değişiklik uygulanıncaya kadar göndermezsiniz. Ayrıca, sağlayıcı, değişiklikleri daha verimli olacak şekilde bir ağ çağrısı içine paketleyebilir.

Ertelenen güncelleştirmeleri desteklemek için "Güncelleştirme İşlemlerini Desteklemek" konusunda bahsedilen özelliklere ek olarak DBPROP_IRowsetChange özelliğini ayarlamanız gerekir:

   pPropSet->AddProperty(DBPROP_IRowsetUpdate, true);

Güncelleştir veya UpdateAll komutunu çağırdığınızda yöntemler değişiklikleri yerel önbellekten veri deposuna aktarır ve sonra yerel belleği temizlerler. Güncelleştirme Değişiklikleri yalnızca geçerli satır için aktardığından, uygulamanızın hangi satırın güncelleştirileceğini ve ne zaman güncelleştirileceğini takip etmesi önemlidir. Aşağıdaki örnek iki ardışık sıranın nasıl güncellendiğini gösterir:

// 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

Bekleyen değişikliklerin aktarılmasını sağlamak için başka bir satıra geçmeden önce Güncelleştir öğesini çağırmanız gerekir. Ancak, bu sıkıcı veya yetersiz olduğunda, örneğin uygulamanızın yüzlerce satırı güncelleştirmesi gerektiğinde, tüm satırları bir seferde güncelleştirmek için UpdateAll kullanabilirsiniz.

Örneğin, ilk Update çağrısı yukarıdaki kodda eksik olduğunda, satır 100 değişmeden kalırken satır 101 değişir. Bu noktadan sonra, uygulamanızın UpdateAll başvurusunu çağırması ya da güncellenecek satır için satır 100'e geri dönüp Güncelle öğesini çağırması gerekebilir.

Son olarak, değişiklikleri ertelemek için bir temel neden onları geri alabilecek olmaktır. CRowset::Undo öğesini çağırmak, yerel değiştirme önbelleğinin durumunu veri deposunun bekleyen değişiklikler yapılmadan önceki durumuna geri getirir. Unutmayın ki Geri Al yerel önbellek durumunu bir adım geri almaz(en son değişimden önceki durum), bunun yerine o satırın yerel önbelleğini temizler. Ayrıca, Geri Al yalnızca geçerli satırı etkiler.

Ayrıca bkz.

Başvuru

OLE DB Tüketici Şablonlarıyla Çalışma

CRowset Class

IRowsetChange