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::OpenEx 和 CDatabase::Open 控件游标库是否将加载。
GetFieldValue 调用ODBC API函数 SQLGetData。 如果您的驱动程序输出字段值的实际长度的值 SQL_NO_TOTAL,GetFieldValue 引发异常。 有关 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类 CDaoRecordset,CRecordset 没有一个 SetFieldValue 成员函数。如果创建了对象直接从 CRecordset,它实际是只读的。
有关批量取行的更多信息,请参见文章 记录集:获取记录(odbc)。
要求
Header: afxdb.h