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 数据类型SQL 数据类型
SQL_C_BITSQL_BIT
SQL_C_UTINYINTSQL_TINYINT
SQL_C_SSHORTSQL_SMALLINT
SQL_C_SLONGSQL_INTEGER
SQL_C_FLOATSQL_REAL
SQL_C_DOUBLESQL_FLOAT
SQL_DOUBLE
SQL_C_TIMESTAMPSQL_DATE
SQL_TIME
SQL_TIMESTAMP
SQL_C_CHARSQL_NUMERIC
SQL_DECIMAL
SQL_BIGINT
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
SQL_C_BINARYSQL_BINARY
SQL_VARBINARY
SQL_LONGVARBINARY
有关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创建了一个对象,它实际上是只读的。

请参阅:
CRecordset::DoFieldExchange, CRecordset::DoBulkFieldExchange, CRecordset::GetODBCFieldCount, CRecordset::GetODBCFieldInfo, CRecordset::SetRowsetCursorPosition