GetFieldValue
CRecordset::GetFieldValue
void GetFieldValue( LPCTSTR lpszName, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );
throw( CDBException, CMemoryException );
void GetFieldValue( short nIndex, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );
throw( CDBException, CMemoryException );
void GetFieldValue( short nIndex, CStringA& strValue );
throw( CDBException, CMemoryException );
void GetFieldValue( short nIndex, CStringW& strValue );
throw( CDBException, CMemoryException );
參數:
lpszName | 一個欄位的名字。 |
varValue | 一個指向CDBVariant對象的引用,該對象將用來保存欄位的值。 |
nFieldType | 欄位的ODBC C數據類型。預設值DEFAULT_FIELD_TYPE強迫GetFieldValue根據下面的表格確定與SQL數據類型相對應的C數據類型。或者,你可以直接指定數據類型或選擇一個兼容的數據類型;例如,你可以將任何數據類型保存到SQL_C_CHAR中。 數據類型對照表 |
C type identifier | ODBC C typedef | C type |
SQL_C_CHAR | SQLCHAR * | unsigned char * |
SQL_C_WCHAR | SQLWCHAR * | wchar_t * |
SQL_C_SSHORT[j] | SQLSMALLINT | short int |
SQL_C_USHORT[j] | SQLUSMALLINT | unsigned short int |
SQL_C_SLONG[j] | SQLINTEGER | long int |
SQL_C_ULONG[j] | SQLUINTEGER | unsigned long int |
SQL_C_FLOAT | SQLREAL | float |
SQL_C_DOUBLE | SQLDOUBLE, SQLFLOAT | double |
SQL_C_BIT | SQLCHAR | unsigned char |
SQL_C_STINYINT[j] | SQLSCHAR | signed char |
SQL_C_UTINYINT[j] | SQLCHAR | unsigned char |
SQL_C_SBIGINT | SQLBIGINT | _int64[h] |
SQL_C_UBIGINT | SQLUBIGINT | unsigned _int64[h] |
SQL_C_BINARY | SQLCHAR * | unsigned char * |
SQL_C_BOOKMARK[i] | BOOKMARK | unsigned long int[d] |
SQL_C_VARBOOKMARK | SQLCHAR * | unsigned char * |
SQL_C_TYPE_DATE[c] | SQL_DATE_STRUCT | struct tagDATE_STRUCT { SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; } DATE_STRUCT;[a] |
SQL_C_TYPE_TIME[c] | SQL_TIME_STRUCT | struct tagTIME_STRUCT { SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; } TIME_STRUCT;[a] |
SQL_C_TYPE_TIMESTAMP[c] | SQL_TIMESTAMP_STRUCT | struct tagTIMESTAMP_STRUCT {SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; SQLUINTEGER fraction;[b] } TIMESTAMP_STRUCT;[a] |
SQL_C_NUMERIC | SQL_NUMERIC_STRUCT | struct tagSQL_NUMERIC_STRUCT { SQLCHAR precision; SQLSCHAR scale; SQLCHAR sign[g]; SQLCHAR val[SQL_MAX_NUMERIC_LEN];[e], [f] } SQL_NUMERIC_STRUCT; |
SQL_C_GUID | SQLGUID | struct tagSQLGUID { DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; } SQLGUID;[k] |
All C interval data types | SQL_INTERVAL_STRUCT | See the C Interval Structure section, later in this appe |
有關ODBC數據類型的更多信息,參見“ODBC SDK程式設計師參考”的附錄D中的“SQL數據類型”和“C數據類型”。 | |
nIndex | 欄位從零開始的索引。 |
strValue | 一個指向CString對象的引用,該對象將把欄位的值保存為文本,而不管欄位的數據類型。 |
說明:
此成員函式用來獲取當前記錄中的欄位數據。你可以用名字或者索引來查找一個欄位。也可以把欄位值保存在一個CDBVariant對象或一個CString對象中。
如果你已經實現了成組行讀取,則在一個行集中的當前記錄總是被定位在第一個記錄。要在一個給定的行集中對一個記錄使用GetFieldValue,必須首先調用SetRowsetCursorPosition成員函式來將游標移動到行集中所希望的行上。然後為這一行調用GetFieldValue。要實現成組行讀取,你必須指定Open成員函式中的dwOptions參數的CRecordset::useMultiRowFetch選項。
你可以使用GetFieldValue在運行時動態地讀取欄位,而不是在設計時靜態地裝訂它們。例如,如果你已經直接從CRecordset聲明了一個記錄集對象,你就必須使用GetFieldValue來獲取欄位數據;記錄欄位交換(RFX),或者是成組記錄欄位交換(Bulk RFX)還沒有實現。
注意:
如果你聲明了一個記錄集對象,而不是從CRecordset派生,則不被裝載ODBC游標庫。此游標庫要求記錄集至少有一個邊界列;但是,當你直接使用CRecordset時,沒有一個列是邊界。成員函式CDatabase::OpenEx和CDatabase::Open控制游標庫是否被裝載。
GetFieldValue調用ODBC API函式SQLGetData。如果你的驅動器為欄位值的實際長度輸出值SQL_NO_TOTAL,GetFieldValue拋出一個異常。關於SQLGetData的更多訊息,參見“ODBC SDK程式設計師參考”。
示例:
下面的例子代碼說明如何為一個直接從CRecordset聲明的記錄集對象調用GetFieldValue。
// 創建並打開一個資料庫對象;
// 不要裝載游標庫
CDatabase db;
db.OpenEx( NULL, CDatabase::forceOdbcDialog );
// 直接從CRecordset創建並打開一個記錄集對象。
// 注意在一個被連線的資料庫中必須存在一個表。
// 使用僅向前類型的記錄集以獲得最佳的性能,因為值需要MoveNext函式。
CRecordset rs( &db );
rs.Open( CRecordset::forwardOnly, _T( "SELECT * FROM SomeTable" ) );
// 創建一個CDBVariant對象來保存欄位數據
CDBVariant varValue;
// 在記錄集中循環,使用GetFieldValue 和GetODBCFieldCount 來獲取所有列中的數據
short nFields = rs.GetODBCFieldCount( );
while( !rs.IsEOF( ) )
{
for( short index = 0; index < nFields; index++ )
{
rs.GetFieldValue( index, varValue );
// 對varValue作某些操作。
}
rs.MoveNext( );
}
rs.Close( );
db.Close( );
注意:
與DAO類CDaoRecordset不一樣,CRecordset沒有SetFieldValue成員函式。如果你直接從CRecordset創建了一個對象,它實際上是唯讀的。