Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Temel veritabanı işlemi, veri depolarını güncelleştirmek veya veri deposuna veri yazmaktır. OLE DB'de güncelleştirme mekanizması basittir: Tüketici uygulamanız ilişkili veri üyelerinin değerlerini ayarlar ve sonra bu değerleri satır kümesine yazar; tüketici daha sonra sağlayıcının veri depoyu güncelleştirmesini istemektedir.
Tüketiciler satır kümesi verilerinde aşağıdaki güncelleştirme türlerini tamamlayabilir: satır içinde sütun değerleri ayarlama, satır ekleme ve satır silme. Bu işlemleri tamamlamak için, OLE DB Template sınıfı CRowset IRowsetChange arabirimini uygular ve aşağıdaki arabirim yöntemlerini geçersiz kılar:
SetData , satır kümesinin bir satırındaki sütun değerlerini değiştirir; SQL UPDATE komutuna eşittir.
Ekle , satır kümesine bir satır ekler; SQL INSERT komutuna eşit olur.
Sil , satır kümesindeki satırları siler; SQL DELETE komutuna eşit olur.
Güncelleştirme İşlemlerini Destekleme
Not
ATL OLE DB Tüketici sihirbazı Visual Studio 2019 ve sonraki sürümlerde kullanılamaz. yine de işlevselliği el ile ekleyebilirsiniz. Daha fazla bilgi için bkz . Sihirbaz Kullanmadan Tüketici Oluşturma.
ATL OLE DB Tüketici Sihirbazı ile bir tüketici oluşturduğunuzda, Değiştir, Ekle ve Sil onay kutularından birini veya daha fazlasını seçerek güncelleştirme işlemlerini destekleyebilirsiniz. Bu seçenekleri belirlerseniz sihirbaz, seçtiğiniz değişiklik türünü desteklemek için kodu uygun şekilde değiştirir. Ancak, sihirbazı kullanmıyorsanız, güncelleştirmeleri desteklemek için VARIANT_TRUE aşağıdaki satır kümesi özelliklerini ayarlamanız gerekir:
DBPROPVAL_UP_CHANGEbir satırdaki veri değerlerini değiştirmenize olanak tanır.DBPROPVAL_UP_INSERTsatır eklemenize olanak tanır.DBPROPVAL_UP_DELETEbir satırı silmenize olanak tanır.
Özellikleri aşağıdaki gibi ayarlarsınız:
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ütun yazılamazsa değiştirme, ekleme veya silme işlemleri başarısız olabilir. Bu sorunu düzeltmek için imleç haritanızı değiştirin.
Satırlardaki Verileri Ayarlama
CRowset::SetData geçerli satırın bir veya daha fazla sütunundaki veri değerlerini ayarlar. Aşağıdaki kod, tablonun Products sütunlarına ve sütunlarına Name bağlı veri üyelerinin değerlerini ayarlar ve Units in Stock sonra bu değerleri satır kümesinin 100. satırına yazmak için çağırırSetData:
// 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şimciden alınan verileri kullanarak yeni bir satır oluşturur ve başlatır. Insert geçerli satırdan sonra tamamen yeni bir satır oluşturur; geçerli satırı bir sonraki satıra artırmayı veya değiştirmeden bırakmayı belirtmeniz gerekir. Bunu yapmak için bGetRow parametresini ayarlarsınız:
HRESULT Insert(int nAccessor = 0, bool bGetRow = false)
false(varsayılan değer), geçerli satırın bir sonraki satıra (bu durumda eklenen satırı işaret eder) arttığını belirtir.truegeçerli satırın olduğu yerde kalacağını belirtir.
Aşağıdaki kod, tablonun Products sütunlarına bağlı veri üyelerinin değerlerini ayarlar ve satır kümesinin 100. satırından sonra bu değerleri içeren yeni bir satır eklemek için çağrı yapar Insert . Yeni satırda tanımlanmamış 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 üyelerini ayarlama hakkında daha fazla bilgi için bkz . Sihirbaz Tarafından Oluşturulan Erişimcilerde Alan Durumu Veri Üyeleri.
Satır Kümelerinden Satır Silme
CRowset::D elete geçerli satırı satır kümesinden siler. Aşağıdaki kod satır kümesinin 100. satırını kaldırmak için çağırır Delete :
// 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 Ertelenen Güncelleştirmeler
Aksini belirtmediğiniz sürece, , Insertve Delete yöntemlerine yapılan SetDataçağrılar veri depoyu hemen güncelleştirir. Ancak, tüketicinin tüm değişiklikleri yerel önbellekte depolaması ve ardından aşağıdaki güncelleştirme yöntemlerinden birini çağırdığınızda bunları veri deposuna aktarması için güncelleştirmeleri erteleyebilirsiniz:
CRowset::Update , son getirme veya
Updateçağrısından sonra geçerli satıra yapılan bekleyen değişiklikleri aktarır.CRowset::UpdateTüm bekleyen değişiklikleri son getirme veya
Updateçağırmadan bu yana tüm satırlara aktarır.
Güncelleştirme yöntemleri tarafından kullanılan güncelleştirme, komutta değişiklik yapmanın belirli bir anlamı vardır ve SQL UPDATE komutuyla karıştırılmamalıdır (SetData SQL UPDATE komutuyla eşdeğerdir).
Ertelenmiş güncelleştirmeler, örneğin bir dizi bankacılık işlemi gibi durumlarda kullanışlıdır; bir işlem iptal edilirse, değişiklik serisini son işlem tamamlanana kadar göndermediğiniz için değişikliği geri alabilirsiniz. Ayrıca sağlayıcı, değişiklikleri tek bir ağ çağrısında paketleyebilir ve bu da daha verimlidir.
Ertelenen DBPROP_IRowsetChange güncelleştirmeleri desteklemek için, özelliği Güncelleştirme İşlemlerini Destekleme bölümünde açıklanan özelliklerle birlikte ayarlamanız gerekir:
pPropSet->AddProperty(DBPROP_IRowsetUpdate, true);
veya UpdateAllöğesini çağırdığınızdaUpdate, yöntemler değişiklikleri yerel önbellekten veri deposuna aktarır ve ardından yerel önbelleği siler. Güncelleştirme aktarımları yalnızca geçerli satır için değiştiğinden, uygulamanızın hangi satırın güncelleştirildiğini ve ne zaman güncelleştirildiğini izlemesi önemlidir. Aşağıdaki örnekte, ardışık iki satırın nasıl güncelleştirilecekleri gösterilmektedir:
// 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ıldığından emin olmak için başka bir satıra geçmeden önce aramanız Update gerekir. Ancak, bu yorucu veya verimsiz olduğunda, örneğin uygulamanızın yüzlerce satırı güncelleştirmesi gerektiğinde, tüm satırları aynı anda güncelleştirmek için kullanabilirsiniz UpdateAll .
Örneğin, yukarıdaki kodda ilk Update çağrı eksikse, satır 100 değişmeden kalırken, satır 101 değiştirilir. Bu noktadan sonra, uygulamanızın 100. satırı çağırması UpdateAll veya 100. satıra geri dönmesi ve bu satırın güncelleştirileceğini çağırması Update gerekir.
Son olarak, değişiklikleri ertelemenin ana nedenlerinden biri bunları geri almaktır. CRowset::Undo çağrısı, bekleyen değişiklikler yapılmadan önce yerel değişiklik önbelleğinin durumunu veri deposunun durumuna geri alır. Yerel önbelleğin Undo durumunu bir adım (yalnızca en son değişiklikten önceki durum) geri almadığını, bunun yerine söz konusu satırın yerel önbelleğini temizlediğini unutmayın. Ayrıca, Undo yalnızca geçerli satırı etkiler.
Ayrıca bkz.
OLE DB Tüketici Şablonlarıyla Çalışma
CRowset Sınıfı
IRowsetChange