Проблемы с доступом к данным с использованием ODBC из SQL

#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 определяют, будет ли загружена библиотека курсоров.