Aracılığıyla paylaş


Kayıt Kümesi: Kayıtları Toplu Yakalama (ODBC)

Bu konu MFC ODBC sınıfları için geçerlidir.

Sınıf CRecordset , toplu satır getirme desteği sağlar. Bu, veri kaynağından bir kerede bir kayıt almak yerine tek bir getirme sırasında birden çok kaydın aynı anda alınabileceği anlamına gelir. Toplu satır getirme işlemini yalnızca türetilmiş CRecordset bir sınıfta uygulayabilirsiniz. Veri kaynağından kayıt kümesi nesnesine veri aktarma işlemine toplu kayıt alanı değişimi (Toplu RFX) adı verilir. Türetilmiş bir CRecordsetsınıfta toplu satır getirme kullanmıyorsanız, verilerin kayıt alanı değişimi (RFX) yoluyla aktarıldığını unutmayın. Daha fazla bilgi için bkz . Kayıt Alanı Değişimi (RFX).

Bu konu başlığı altında açıklanmaktadır:

CRecordset Toplu Satır Getirmeyi Nasıl Destekler?

Kayıt kümesi nesnenizi açmadan önce üye işleviyle SetRowsetSize bir satır kümesi boyutu tanımlayabilirsiniz. Satır kümesi boyutu, tek bir getirme sırasında kaç kaydın alınması gerektiğini belirtir. Toplu satır getirme uygulandığında, varsayılan satır kümesi boyutu 25'tir. Toplu satır getirme uygulanmazsa satır kümesi boyutu 1'de sabit kalır.

Satır kümesi boyutunu başlatıldıktan sonra Open member işlevini çağırın. Burada toplu satır getirme uygulamak için dwOptions parametresinin seçeneğini belirtmeniz CRecordset::useMultiRowFetch gerekir. Ayrıca seçeneğini de ayarlayabilirsiniz CRecordset::userAllocMultiRowBuffers . Toplu kayıt alanı değişim mekanizması, getirme sırasında alınan birden çok veri satırını depolamak için dizileri kullanır. Bu depolama arabellekleri çerçeve tarafından otomatik olarak tahsis edilebilir veya bunları el ile ayırabilirsiniz. seçeneğinin belirtilmesi CRecordset::userAllocMultiRowBuffers , ayırma işlemini gerçekleştireceğiniz anlamına gelir.

Aşağıdaki tabloda, tarafından CRecordset toplu satır getirmeyi desteklemek için tarafından sağlanan üye işlevleri listelenmektedir.

Üye işlevi Tanım
CheckRowsetError Getirme sırasında oluşan hataları işleyen sanal işlev.
Dobulkfieldexchange Toplu kayıt alanı değişimini uygular. Veri kaynağından kayıt kümesi nesnesine birden çok veri satırı aktarmak için otomatik olarak çağrılır.
GetRowsetSize Satır kümesi boyutu için geçerli ayarı alır.
GetRowsFetched Belirli bir getirmeden sonra gerçekte kaç satırın alındığını bildirir. Çoğu durumda, tamamlanmamış bir satır kümesi getirilmediği sürece bu satır kümesi boyutudur.
GetRowStatus Satır kümesi içindeki belirli bir satır için getirme durumu döndürür.
RefreshRowset Satır kümesi içindeki belirli bir satırın verilerini ve durumunu yeniler.
SetRowsetCursorPosition İmleci satır kümesi içindeki belirli bir satıra taşır.
SetRowsetSize Satır kümesi boyutunun ayarını belirtilen değere değiştiren sanal işlev.

Dikkat Edilmesi Gereken Özel Noktalar

Toplu satır getirme bir performans kazancı olsa da, bazı özellikler farklı çalışır. Toplu satır getirme uygulamaya karar vermeden önce aşağıdakileri göz önünde bulundurun:

  • Çerçeve, veri kaynağından DoBulkFieldExchange kayıt kümesi nesnesine veri aktarmak için üye işlevini otomatik olarak çağırır. Ancak, veriler kayıt kümesinden veri kaynağına geri aktarılmaz. , , Editveya DeleteUpdate üye işlevlerinin AddNewçağrılması, başarısız bir onay işlemine neden olur. Şu anda toplu veri satırlarını güncelleştirmek için bir mekanizma sağlamasa CRecordset da, ODBC API işlevini SQLSetPoskullanarak kendi işlevlerinizi yazabilirsiniz. hakkında SQLSetPosdaha fazla bilgi için bkz . ODBC Programcı Başvurusu.

  • Üye işlevleri IsDeleted, , IsFieldDirtyIsFieldNull, IsFieldNullable, , SetFieldDirtyve SetFieldNull toplu satır getirme uygulayan kayıt kümelerinde kullanılamaz. Ancak yerine ve GetODBCFieldInfo yerine IsDeletedIsFieldNullableöğesini çağırabilirsinizGetRowStatus.

  • İşlemler Move , kayıt kümenizi satır kümesine göre yeniden konumlandırır. Örneğin, ilk satır kümesi boyutu 10 olan 100 kaydı olan bir kayıt kümesi açtığınızı varsayalım. Open 1 ile 10 arasında satırları getirir ve geçerli kayıt 1. satıra konumlandırılır. Çağrısı MoveNext , sonraki satırı değil sonraki satır kümesini getirir. Bu satır kümesi 11 ile 20 arasında satırdan oluşur ve geçerli kayıt 11. satıra konumlandırılır. MoveNext Toplu satır getirme uygulandığında ve Move( 1 ) değerlerinin eşdeğer olmadığını unutmayın. Move( 1 ) geçerli kayıttan 1 satırdan başlayan satır kümesini getirir. Bu örnekte, çağrıldıktan sonra çağrılması Move( 1 )Open , geçerli kaydın satır 2'ye konumlandırılmış olduğu 2 ile 11 arasında satırlardan oluşan satır kümesini getirir. Daha fazla bilgi için bkz. Üyeyi taşıma işlevi.

  • Kayıt alanı değişiminden farklı olarak, sihirbazlar toplu kayıt alanı değişimini desteklemez. Bu, alan veri üyelerinizi el ile bildirmeniz ve Toplu RFX işlevlerine çağrılar yazarak el ile geçersiz kılmanız DoBulkFieldExchange gerektiği anlamına gelir. Daha fazla bilgi için bkz. Sınıf Kitaplığı Başvurusu'ndaki Kayıt Alanı Değişim İşlevleri.

Toplu Kayıt Alanı DeğişimiNi Uygulama

Toplu kayıt alanı değişimi, veri kaynağındaki bir veri satır kümesini kayıt kümesi nesnesine aktarır. Toplu RFX işlevleri, bu verileri depolamak için dizilerin yanı sıra her veri öğesinin uzunluğunu satır kümesinde depolamak için dizileri kullanır. Sınıf tanımınızda, veri dizilerine erişmek için alan veri üyelerinizi işaretçi olarak tanımlamanız gerekir. Ayrıca, uzunluk dizilerine erişmek için bir işaretçi kümesi tanımlamanız gerekir. Parametre veri üyeleri işaretçi olarak bildirilmemelidir; toplu kayıt alanı değişimi kullanılırken parametre veri üyelerini bildirmek, kayıt alanı değişimi kullanılırken bunları bildirmekle aynıdır. Aşağıdaki kodda basit bir örnek gösterilmektedir:

class MultiRowSet : public CRecordset
{
public:
   // Field/Param Data
      // field data members
      long* m_rgID;
      LPSTR m_rgName;

      // pointers for the lengths
      // of the field data
      long* m_rgIDLengths;
      long* m_rgNameLengths;

      // input parameter data member
      CString m_strNameParam;

   .
   .
   .
}

Bu depolama arabelleklerini el ile ayırabilir veya ayırmayı çerçevenin gerçekleştirmesini sağlayabilirsiniz. Arabellekleri kendiniz ayırmak için üye işlevinde CRecordset::userAllocMultiRowBuffers dwOptions parametresi Open seçeneğini belirtmeniz gerekir. Dizilerin boyutlarını en azından satır kümesi boyutuna eşit olarak ayarladığınızdan emin olun. Ayırmayı çerçevenin gerçekleştirmesini istiyorsanız, NULL işaretçilerinizi başlatmanız gerekir. Bu genellikle kayıt kümesi nesnesinin oluşturucusunda yapılır:

MultiRowSet::MultiRowSet( CDatabase* pDB )
   : CRecordset( pDB )
{
   m_rgID = NULL;
   m_rgName = NULL;
   m_rgIDLengths = NULL;
   m_rgNameLengths = NULL;
   m_strNameParam = "";

   m_nFields = 2;
   m_nParams = 1;

   .
   .
   .
}

Son olarak, üye işlevini geçersiz kılmalısınız DoBulkFieldExchange . Alan veri üyeleri için Toplu RFX işlevlerini çağırın; tüm parametre veri üyeleri için RFX işlevlerini çağırın. Kayıt kümesini bir SQL deyimi veya saklı yordam Opengeçirerek açtıysanız, Toplu RFX çağrılarını yaptığınız sıra kayıt kümesindeki sütunların sırasına karşılık gelir; benzer şekilde, parametreler için RFX çağrılarının sırası SQL deyimindeki veya saklı yordamdaki parametrelerin sırasına karşılık gelir.

void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
   // call the Bulk RFX functions
   // for field data members
   pFX->SetFieldType( CFieldExchange::outputColumn );
   RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                  &m_rgID, &m_rgIDLengths );
   RFX_Text_Bulk( pFX, _T( "[colName]" ),
                  &m_rgName, &m_rgNameLengths, 30 );

   // call the RFX functions for
   // for parameter data members
   pFX->SetFieldType( CFieldExchange::inputParam );
   RFX_Text( pFX, "NameParam", m_strNameParam );
}

Dekont

Türetilmiş CRecordset sınıfınız kapsamın dışına çıkmadan önce üye işlevini çağırmalısınızClose. Bu, çerçeve tarafından ayrılan tüm belleklerin serbest kalmasını sağlar. Toplu satır getirme işlemi gerçekleştirip uygulamadığınıza bakılmaksızın her zaman açıkça çağrısı Closeyapmak iyi bir programlama uygulamasıdır.

Kayıt alanı değişimi (RFX) hakkında daha fazla bilgi için bkz . Kayıt Alanı Değişimi: RFX Nasıl Çalışır? Parametreleri kullanma hakkında daha fazla bilgi için bkz . CFieldExchange::SetFieldType ve Recordset: Kayıt Kümesini Parametreleştirme (ODBC).

Ayrıca bkz.

Kayıt Kümesi (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams