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.
Birden çok erişimci kullanmanız gereken üç temel senaryo vardır:
Birden çok okuma/yazma satır kümesi. Bu senaryoda, birincil anahtar içeren bir tablonuz vardır. Birincil anahtar da dahil olmak üzere satırdaki tüm sütunları okuyabilmek istiyorsunuz. Ayrıca birincil anahtar dışındaki tüm sütunlara veri yazabilmek istiyorsunuz (çünkü birincil anahtar sütununa yazamazsınız). Bu durumda iki erişimci ayarlarsınız:
Erişimci 0 tüm sütunları içerir.
Erişimci 1, birincil anahtar dışındaki tüm sütunları içerir.
Performans. Bu senaryoda, bir veya daha fazla sütun grafik, ses veya video dosyası gibi büyük miktarda veriye sahiptir. Bir satıra her taşıdığınızda büyük veri dosyasını içeren sütunu almak istemezsiniz çünkü bunu yapmak uygulamanızın performansını yavaşlatır.
İlk erişimcinin büyük verileri olan hariç tüm sütunları içerdiği ve bu sütunlardan otomatik olarak veri aldığı ayrı erişimciler ayarlayabilirsiniz; ilk erişimci otomatik erişimcidir. İkinci erişimci yalnızca büyük verileri içeren sütunu alır, ancak bu sütundan otomatik olarak veri almaz. Başka yöntemlerin büyük verileri isteğe bağlı olarak güncelleştirmesini veya getirmesini sağlayabilirsiniz.
Accessor 0 otomatik bir aksesuardır; büyük veri içeren sütun dışındaki tüm sütunları alır.
Erişimci 1 otomatik erişimci değildir; büyük veri içeren sütunu alır.
Erişimcinin otomatik erişimci olup olmadığını belirtmek için otomatik bağımsız değişkenini kullanın.
Birden çok ISequentialStream sütunu. Bu senaryoda, verileri tutan
ISequentialStreambirden fazla sütuna sahipsiniz. Ancak her erişimci birISequentialStreamveri akışıyla sınırlıdır. Bu sorunu çözmek için her biri birISequentialStreamişaretçiye sahip olan birkaç erişimci ayarlayın.
Normalde BEGIN_ACCESSOR ve END_ACCESSOR makroları kullanarak erişimci oluşturursunuz. db_accessor özniteliğini de kullanabilirsiniz. (Erişimcilerin açıklandığı yer: Kullanıcı Kayıtları.) Makrolar veya öznitelik, erişimcinin otomatik mi yoksa otomatik olmayan erişimci mi olduğunu belirtir:
Otomatik erişimcide ,
MoveLast,MoveNextve gibiMoveFirstyöntemleri taşıyın veMovePrevbelirtilen tüm sütunlar için verileri otomatik olarak alın. Aksesuar 0, otomatik erişimci olmalıdır.Otomatik olmayan bir erişimcide, ,
Insert,FetchveyaDeletegibiUpdatebir yöntemi açıkça çağırana kadar alma işlemi gerçekleşmez. Yukarıda açıklanan senaryolarda, her taşımada tüm sütunları almak istemeyebilirsiniz. Aşağıda gösterildiği gibi bir veya daha fazla sütunu ayrı bir erişimciye yerleştirebilir ve bunu otomatik olmayan bir erişimci yapabilirsiniz.
Aşağıdaki örnek, birden çok erişimci kullanarak SQL Server pubs veritabanının işler tablosunu okumak ve bu tabloya yazmak için birden çok erişimci kullanır. Bu örnek, birden çok erişimcinin en yaygın kullanımıdır; yukarıdaki "birden çok okuma/yazma satır kümesi" senaryosuna bakın.
Kullanıcı kayıt sınıfı aşağıdaki gibidir. İki erişimci ayarlar: erişimci 0 yalnızca birincil anahtar sütununu (KIMLIK) ve erişimci 1 diğer sütunları içerir.
class CJobs
{
public:
enum {
sizeOfDescription = 51
};
short nID;
char szDescription[ sizeOfDescription ];
short nMinLvl;
short nMaxLvl;
DWORD dwID;
DWORD dwDescription;
DWORD dwMinLvl;
DWORD dwMaxLvl;
BEGIN_ACCESSOR_MAP(CJobs, 2)
// Accessor 0 is the automatic accessor
BEGIN_ACCESSOR(0, true)
COLUMN_ENTRY_STATUS(1, nID, dwID)
END_ACCESSOR()
// Accessor 1 is the non-automatic accessor
BEGIN_ACCESSOR(1, true)
COLUMN_ENTRY_STATUS(2, szDescription, dwDescription)
COLUMN_ENTRY_STATUS(3, nMinLvl, dwMinLvl)
COLUMN_ENTRY_STATUS(4, nMaxLvl, dwMaxLvl)
END_ACCESSOR()
END_ACCESSOR_MAP()
};
Ana kod aşağıdaki gibidir. Çağrısı MoveNext , erişimci 0'ı kullanarak birincil anahtar sütun kimliğinden verileri otomatik olarak alır. Sonuna yakın olan yöntemin Insert birincil anahtar sütununa yazılmasını önlemek için erişimci 1'i nasıl kullandığını unutmayın.
int main(int argc, char* argv[])
{
// Initialize COM
::CoInitialize(NULL);
// Create instances of the data source and session
CDataSource source;
CSession session;
HRESULT hr = S_OK;
// Set initialization properties
CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("my_user_id"));
dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("pubs"));
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("(local)"));
hr = source.Open("SQLOLEDB.1", &dbinit);
if (hr == S_OK)
{
hr = session.Open(source);
if (hr == S_OK)
{
// Ready to fetch/access data
CTable<CAccessor<CJobs>> jobs;
// Set properties for making the rowset a read/write cursor
CDBPropSet dbRowset(DBPROPSET_ROWSET);
dbRowset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
dbRowset.AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
dbRowset.AddProperty(DBPROP_IRowsetChange, true);
dbRowset.AddProperty(DBPROP_UPDATABILITY,
DBPROPVAL_UP_INSERT | DBPROPVAL_UP_CHANGE |
DBPROPVAL_UP_DELETE);
hr = jobs.Open(session, "jobs", &dbRowset);
if (hr == S_OK)
{
// Calling MoveNext automatically retrieves ID
// (using accessor 0)
while(jobs.MoveNext() == S_OK)
printf_s("Description = %s\n", jobs.szDescription);
hr = jobs.MoveFirst();
if (hr == S_OK)
{
jobs.nID = 25;
strcpy_s(&jobs.szDescription[0],
jobs.sizeOfDescription,
"Developer");
jobs.nMinLvl = 10;
jobs.nMaxLvl = 20;
jobs.dwDescription = DBSTATUS_S_OK;
jobs.dwID = DBSTATUS_S_OK;
jobs.dwMaxLvl = DBSTATUS_S_OK;
jobs.dwMinLvl = DBSTATUS_S_OK;
// Insert method uses accessor 1
// (to avoid writing to the primary key column)
hr = jobs.Insert(1);
}
jobs.Close();
}
session.Close();
}
source.Close();
}
// Uninitialize COM
::CoUninitialize();
return 0;
}