CRecordset +GetFieldValue() - ошибка
От: MyLifeMyChoice Россия  
Дата: 23.07.04 08:03
Оценка:
Здравствуйте!

Проблема в следующем:
Во-превых,
В выборке из БД 3 поля. Делаю

CDatabase db;
...
CRecordset rec(&db);
rec.Open(....);

CDBVariant varValue;
rec.GetFieldValue(1,varValue); // Все проходит замечательно
rec.GetFieldValue(1,varValue); // А теперь CDBException возникает с m_nRetCode = 100! Что за ...? Почему так?

Во-вторых, почему-то нельзя напрямую обратиться к первому полю

rec.GetFieldValue(0,varValue); // Студия пишет: 'GetFieldValue' : ambiguous call to overloaded function

// если сделать
short index = 0;
rec.GetFieldValue(index,varValue); // все проглатывает! Непоянтно.
Re: CRecordset +GetFieldValue() - ошибка
От: rus blood Россия  
Дата: 23.07.04 08:11
Оценка:
Здравствуйте, MyLifeMyChoice, Вы писали:

MLM>CDBVariant varValue;

MLM>rec.GetFieldValue(1,varValue); // Все проходит замечательно
MLM>rec.GetFieldValue(1,varValue); // А теперь CDBException возникает с m_nRetCode = 100! Что за ...? Почему так?
Посмотри отладчиком этот вызов.


MLM>Во-вторых, почему-то нельзя напрямую обратиться к первому полю

MLM>rec.GetFieldValue(0,varValue); // Студия пишет: 'GetFieldValue' : ambiguous call to overloaded function
Есть две версии этой функции со вторым параметром CDBValue&.
Одна берет на вход параметр LPCTSTR (название поля), вторая — short (индекс поля).
Значение 0 может интерпретивроваться и как LPCTSTR, и как short.
И доблестный компилятор не знает, какую именно функцию ты хочешь вызвать...

Надо ему в этом помочь:
rec.GetFieldValue((short)0,varValue);
Имею скафандр — готов путешествовать!
Re[2]: CRecordset +GetFieldValue() - ошибка
От: MyLifeMyChoice Россия  
Дата: 23.07.04 09:01
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, MyLifeMyChoice, Вы писали:


MLM>>CDBVariant varValue;

MLM>>rec.GetFieldValue(1,varValue); // Все проходит замечательно
MLM>>rec.GetFieldValue(1,varValue); // А теперь CDBException возникает с m_nRetCode = 100! Что за ...? Почему так?
RB>Посмотри отладчиком этот вызов.


Вылетает на:
// Retrieve the column in question
AFX_ODBC_CALL(::SQLGetData(hstmt, nFieldIndex,
nFieldType, pvData, nLen, &nActualSize));

Причем параметры передаются совершенно одинаковые. В певом случае RetCode = 0; Во втором RetCode = 100;
Re[3]: CRecordset +GetFieldValue() - ошибка
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 23.07.04 09:08
Оценка:
Здравствуйте, MyLifeMyChoice, Вы писали:

MLM>Вылетает на:

MLM>// Retrieve the column in question
MLM> AFX_ODBC_CALL(::SQLGetData(hstmt, nFieldIndex,
MLM> nFieldType, pvData, nLen, &nActualSize));

MLM>Причем параметры передаются совершенно одинаковые. В певом случае RetCode = 0; Во втором RetCode = 100;


Поставьте try/catch и посмотрите, какое сообщение об ошибке будет сидеть в CDBException.
- Искренне ваш, Поросенок Пафнутий
Re[4]: CRecordset +GetFieldValue() - ошибка
От: MyLifeMyChoice Россия  
Дата: 23.07.04 09:17
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Поставьте try/catch и посмотрите, какое сообщение об ошибке будет сидеть в CDBException.


m_strError = "";
m_nRetCode = 100;

Идет через
GetData(m_pDatabase, m_hstmt, nIndex,
nFieldType, pvData, nLen,
m_rgODBCFieldInfos[nIndex — 1].m_nSQLType);

Потом втутри через

RETCODE nRetCode;

// Retrieve the column in question
AFX_ODBC_CALL(::SQLGetData(hstmt, nFieldIndex,
nFieldType, pvData, nLen, &nActualSize));

Здесь то и ставится m_nRetCode = 100, что соотвествует SQL_NO_DATA_FOUND;

TRACE0("Error: GetFieldValue operation failed on field %d.\n");
TRACE1("\tData already fetched for this field.\n",
nFieldIndex — 1);
Я прекрасно понимаю, что она уже fetched, но я пишу рекурсивную функцию и мне это не обойти (либо может как-нибудь и получится, но через такой ASS!)
Re[5]: CRecordset +GetFieldValue() - ошибка
От: rus blood Россия  
Дата: 23.07.04 09:37
Оценка:
Здравствуйте, MyLifeMyChoice, Вы писали:

MLM>... я пишу рекурсивную функцию и мне это не обойти (либо может как-нибудь и получится, но через такой ASS!)


А подробнее??
Имею скафандр — готов путешествовать!
Re[6]: CRecordset +GetFieldValue() - ошибка
От: MyLifeMyChoice Россия  
Дата: 23.07.04 11:56
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, MyLifeMyChoice, Вы писали:


MLM>>... я пишу рекурсивную функцию и мне это не обойти (либо может как-нибудь и получится, но через такой ASS!)


RB>А подробнее??


Да все больше не надо, я обошел. GetFieldValue может вызываться для данного положения курсора для одного и того же столбца в выборке только один раз. Я просто сделал

static BOOL flag = FALSE;

Потом манипулировал этим флагом в проге таким образом, чтобы не вызывать GetFieldValue два раза.

А чтобы обеспечить сохранение значения ввел еще один static:

static CDBVariant varID;

Элементарно, Ватсон, как говорится!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.