Aracılığıyla paylaş


Satır Kümesinde Çoklu Erişimci Kullanma

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 ISequentialStream birden fazla sütuna sahipsiniz. Ancak her erişimci bir ISequentialStream veri akışıyla sınırlıdır. Bu sorunu çözmek için her biri bir ISequentialStream iş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 gibi MoveFirstyöntemleri taşıyın ve MovePrev belirtilen 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, Fetchveya Deletegibi Updatebir 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;
}

Ayrıca bkz.

Erişimcileri Kullanma
Kullanıcı Kayıtları