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 CRecordset
sı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?
Toplu satır getirme kullanılırken dikkat edilmesi gereken bazı özel noktalar.
Toplu kayıt alanı değişimini uygulama.
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. , ,Edit
veyaDelete
Update
üye işlevlerininAddNew
ç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ğlamasaCRecordset
da, ODBC API işleviniSQLSetPos
kullanarak kendi işlevlerinizi yazabilirsiniz. hakkındaSQLSetPos
daha fazla bilgi için bkz . ODBC Programcı Başvurusu.Üye işlevleri
IsDeleted
, ,IsFieldDirty
IsFieldNull
,IsFieldNullable
, ,SetFieldDirty
veSetFieldNull
toplu satır getirme uygulayan kayıt kümelerinde kullanılamaz. Ancak yerine veGetODBCFieldInfo
yerineIsDeleted
IsFieldNullable
öğ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 veMove( 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 Open
geç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ı Close
yapmak 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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin