CRecordset::GetFieldValue

检索在当前记录的字段数据。

void GetFieldValue( 
   LPCTSTR lpszName, 
   CDBVariant& varValue, 
   short nFieldType = DEFAULT_FIELD_TYPE  
);
void GetFieldValue( 
   short nIndex, 
   CDBVariant& varValue, 
   short nFieldType = DEFAULT_FIELD_TYPE  
);
void GetFieldValue(
   short nIndex,
   CStringA& strValue 
);
void GetFieldValue(
   short nIndex,
   CStringW& strValue 
);

参数

  • lpszName
    字段的名称。

  • varValue
    要存储字段的值 CDBVariant 对象的引用。

  • nFieldType
    字段的ODBC C数据类型。 使用默认值,DEFAULT_FIELD_TYPE,强制 GetFieldValue 根据下表来确定从SQL数据类型的C数据类型。 否则,可以直接指定数据类型或选择一个兼容的数据类型;例如,可以存储任何数据类型。SQL_C_CHAR

    C数据类型

    SQL 数据类型

    SQL_C_BIT

    SQL_BIT

    SQL_C_UTINYINT

    SQL_TINYINT

    SQL_C_SSHORT

    SQL_SMALLINT

    SQL_C_SLONG

    SQL_INTEGER

    SQL_C_FLOAT

    SQL_REAL

    SQL_C_DOUBLE

    SQL_FLOATSQL_DOUBLE

    SQL_C_TIMESTAMP

    SQL_DATESQL_TIMESQL_TIMESTAMP

    SQL_C_CHAR

    SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR

    SQL_C_BINARY

    SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY

    有关ODBC数据类型的更多信息,请参见主题“SQL数据类型”和“C数据类型”。Windows SDK的附录D。

  • nIndex
    字段的从零开始的索引。

  • strValue
    无论字段的数据类型,为要存储字段的值 CString 对象的引用转换为文本。

备注

可以查找字段按名称或按索引。 在 CDBVariant 对象或 CString 对象中存储字段值。

如果已实现批量取行,当前记录在行集合的第一条记录始终确定。 若要使用在记录的 GetFieldValue 在特定行集合中,则必须首先调用 SetRowsetCursorPosition 成员函数将光标移动到该行集合中的所需行。 然后调用该行的 GetFieldValue。 若要实现批量取行,则在 打开 成员函数必须指定 dwOptions 参数的 CRecordset::useMultiRowFetch 选项。

可以使用 GetFieldValue 动态获取字段在运行时而不是静态绑定它们在设计时。 例如,因此,如果声明记录集对象直接从 CRecordset,必须使用 GetFieldValue 检索字段数据;记录字段交换(rfx),或者批量记录字段交换(bulk RFX),不会实现。

备注

如果声明记录集对象,而无需从派生 CRecordset,不要将加载了ODBC游标库。游标库调用记录集至少有一个绑定列;但是,那么,当您直接时使用 CRecordset,列都未绑定。该成员函数 CDatabase::OpenExCDatabase::Open 控件游标库是否将加载。

GetFieldValue 调用ODBC API函数 SQLGetData。 如果您的驱动程序输出字段值的实际长度的值 SQL_NO_TOTALGetFieldValue 引发异常。 有关 SQLGetData的更多信息,请参见 Windows SDK。

异常

此方法会引发类型 CDBException* 和 **CMemoryException***的异常。

示例

下面的代码示例阐释调用直接从 CRecordset声明的记录集对象的 GetFieldValue

// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);

// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));

// Create a CDBVariant object to
// store field data
CDBVariant varValue;

// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while(!rs.IsEOF())
{
   for(short index = 0; index < nFields; index++)
   {
      rs.GetFieldValue(index, varValue);
      // do something with varValue
   }
   rs.MoveNext();
}

rs.Close();
db.Close();

备注

不同选件DAO类 CDaoRecordsetCRecordset 没有一个 SetFieldValue 成员函数。如果创建了对象直接从 CRecordset,它实际是只读的。

有关批量取行的更多信息,请参见文章 记录集:获取记录(odbc)

要求

Header: afxdb.h

请参见

参考

CRecordset选件类

层次结构图

CRecordset::DoFieldExchange

CRecordset::DoBulkFieldExchange

CRecordset::GetODBCFieldCount

CRecordset::GetODBCFieldInfo

CRecordset::SetRowsetCursorPosition