getirilirken toplu kayıt uygulanması, kontrolüm bir açılır içine MS Access veritabanı (.mdb) veri okumak gerekiyor. Bu, kullanıcı bu denetimde her yazdığında, uygulamanın otomatik tamamlayabilmesi için yapılır. Ben getirilirken toplu satır uygulamak düşündüm bu yüzdenbenim Programın başında
Neyse, veritabanından okuma sonsuza kadar sürdü.
#if !defined(__MULTIROWSET_H_AD12FD1F_0566_4cb2_AE11_057227A594B8__)
#define __MULTIROWSET_H_AD12FD1F_0566_4cb2_AE11_057227A594B8__
class CMultiRowset : public CRecordset
{
public:
// Field data members
LPSTR m_NameData;
// Pointers for the lengths of the field data
long* m_NameDataLengths;
// Constructor
CMultiRowset(CDatabase *);
// Methods
void DoBulkFieldExchange(CFieldExchange *);
};
#endif
Ve veritabanında
,INFOTABLE
benziyor:
#include "stdafx.h"
#include "afxdb.h"
#include "MultiRowset.h"
// Constructor
CMultiRowset::CMultiRowset(CDatabase *pDB)
: CRecordset(pDB)
{
m_NameData = NULL;
m_NameDataLengths = NULL;
m_nFields = 1;
CRecordset::CRecordset(pDB);
}
void CMultiRowset::DoBulkFieldExchange(CFieldExchange *pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text_Bulk(pFX, _T("[NAME]"), &m_NameData, &m_NameDataLengths, 30);
}
MultiRowset.h
benziyor:
CString sDsn;
CString sField;
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
TRY
{
// Open the database
database.Open(NULL,false,false,sDsn);
// Allocate the rowset
CMultiRowset recset(&database);
// Build the SQL statement
SqlString = "SELECT NAME "
"FROM INFOTABLE";
// Set the rowset size. These many rows will be fetched in one bulk operation
recset.SetRowsetSize(25);
// Open the rowset
recset.Open(CRecordset::forwardOnly, SqlString, CRecordset::readOnly | CRecordset::useMultiRowFetch);
// Loop through each rowset
while(!recset.IsEOF())
{
int rowsFetched = (int)recset.GetRowsFetched(); // This value is always 1 somehow
for(int rowCount = 1; rowCount <= rowsFetched; rowCount++)
{
recset.SetRowsetCursorPosition(rowCount);
recset.GetFieldValue("NAME",sField);
m_nameDropDown.AddString(sField);
}
// Go to next rowset
recset.MoveNext();
}
// Close the database
database.Close();
}
CATCH(CDBException, e)
{
// If a database exception occured, show error msg
AfxMessageBox("Database error: "+e->m_strError);
}
END_CATCH;
MultiRowset.cpp
benziyor:
Bu
Ben kodudur:Tüm yapmam gereken veriden yalnızca okuyor. Birisi bana neyi yanlış yaptığımı söyler mi? Kodum şu anda normal bir getirme gibi davranıyor. Toplu alım yok.
EDIT: Sadece DBRFX.cpp
etrafında dürttü ve RFX_Text_Bulk()
benim new char[nRowsetSize * nMaxLength]
olarak m_NameData
geçti başlatır öğrendim
!
Bu, m_NameData
'un yalnızca bir karakter dizisi olduğu anlamına gelir! Birden çok isim almam gerekiyor, bu yüzden 2B karakter dizisine ihtiyacım olmaz mı? En garip şey, aynı RFX_Text_Bulk()
, m_NDCDataLengths
iletimi new long[nRowsetSize]
olarak başlatır. Neden dünyadaki bir karakter dizisi bir dizi diziye ihtiyaç duyardı ?!
Veritabanınızdaki "[NAME]" alanının boyutu nedir? – Goldorak84
@ Goldorak84, en fazla 15 karakter. –
Aslında, m_NameData bir dizi karakter dizisini temsil eder. m_NDCDataLengths, m_NameData – Goldorak84