#sql-server #mfc #odbc #visual-c
#sql-server #mfc #odbc #visual-c
Вопрос:
Я использую MFC для извлечения данных из источника данных SQL с использованием ODBC.
У меня возникла проблема с получением полей данных, отличных от поля «id» в таблице.В последующих итерациях обнаруживается, что
значение переменной равно null для полей, отличных от «id».
Пожалуйста, помогите мне получить доступ ко всем полям данных в таблице
Table data:
**id**(nchar) name(varchar) age(varchar)
0 **11** john 24
1 **22** troy 25
2 **33** bill 21
only ids are fetched.
CDatabase db;
db.OpenEx( NULL, CDatabase::forceOdbcDialog );
CRecordset rs( amp;db );
rs.Open( CRecordset::forwardOnly,
_T( "SELECT * FROM REPDB.dbo.fellas" ) );
CDBVariant varValue;
short nFields = rs.GetODBCFieldCount( );
while( !rs.IsEOF( ) )
{
for( short index = 0; index < nFields; index )
{
rs.GetFieldValue( index, varValue,DEFAULT_FIELD_TYPE );
}
}
Спасибо.
Ответ №1:
Это предположение: проблема может быть в DEFAULT_FIELD_TYPE
. Используя обычный CRecordset
, ODBC API может быть не в состоянии определить тип поля. Вы можете попробовать опустить этот параметр и посмотреть, получите ли вы представления всех полей в виде массива символов, или использовать SQL_C_CHAR
вместо DEFAULT_FIELD_TYPE
, поскольку все ваши поля являются строковыми типами.
Также отсутствует вызов rs.MoveNext в конце цикла while.
Другой возможностью является использование библиотеки cursor: смотрите Это примечание на странице GetFieldValue MSDN:
Примечание: Если вы объявляете объект набора записей без получения из CRecordset, не загружайте библиотеку курсоров ODBC. Библиотека cursor требует, чтобы набор записей имел хотя бы один связанный столбец; однако, когда вы используете CRecordset напрямую, ни один из столбцов не привязан. Функции-члены CDatabase::OpenEx и CDatabase::Open определяют, будет ли загружена библиотека курсоров.