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); // все проглатывает! Непоянтно.
Здравствуйте, 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.
И доблестный компилятор не знает, какую именно функцию ты хочешь вызвать...
Здравствуйте, 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;
Здравствуйте, 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.
Здравствуйте, 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!)
Здравствуйте, MyLifeMyChoice, Вы писали:
MLM>... я пишу рекурсивную функцию и мне это не обойти (либо может как-нибудь и получится, но через такой ASS!)
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, MyLifeMyChoice, Вы писали:
MLM>>... я пишу рекурсивную функцию и мне это не обойти (либо может как-нибудь и получится, но через такой ASS!)
RB>А подробнее??
Да все больше не надо, я обошел. GetFieldValue может вызываться для данного положения курсора для одного и того же столбца в выборке только один раз. Я просто сделал
static BOOL flag = FALSE;
Потом манипулировал этим флагом в проге таким образом, чтобы не вызывать GetFieldValue два раза.
А чтобы обеспечить сохранение значения ввел еще один static: