Roguewave error 9 [ENDOFFETCH] End Of Fetch - кто-нибудь знает, что это значит?
Хорошо, я знакомлюсь со своей работой с этим вопросом о библиотеке, которую я не кодировал много лет... У меня есть код, который был в производстве с конца 1990-х годов, написанный на Visual Studio 6.0 C++ с использованием DBTools++ Roguewave.
Внезапно, для определенного случая, запрос не выполняется, и RWDBStatus указывает код ошибки 9, сообщение [ENDOFFETCH} Конец выборки. Когда я пытаюсь выполнить запросы ниже с соответствующими ключами, я получаю эту странную ошибку. Примечание. Я также изменю код, чтобы он был более точным в отношении того, какой запрос не выполняется, хотя, похоже, это второй запрос, который не выполняется, поскольку он выполняется только в том случае, если первый запрос вернул значение...
Итак, мой вопрос: кто-нибудь знает, что означает "конец выборки" в этом контексте? Это в настоящее время не подсказывает мне, где искать этот... Вот сообщение об ошибке, код ниже...
06/04/2014 16:00:40 FindSignature() - failed to execute!
06/04/2014 16:00:40 ErrorCode = 9,ErrorMsg = [ENDOFFETCH] End of Fetch
06/04/2014 16:00:40 VendCode1 = 0,VendCode2 = 0
06/04/2014 16:00:40 VendMsg1 = ,VendMsg2 =
Вот мой код:
bool result = false;
RWDBTable tblRMSUsers = m_RMSDatabase.table( "RMSUsers" );
RWDBSelector selRecord = m_RMSDatabase.selector();
selRecord << tblRMSUsers["ExternalKey"];
selRecord.where( tblRMSUsers["InternalKey"] == lLinkToUser );
RWDBReader rdrRecord = selRecord.reader(theConnection);
if( rdrRecord() )
{
RWCString s;
rdrRecord >> s;
// Changed to use view_SwitchUsers2 which includes deleted / inactive users...
RWDBTable tblSwitchUsers = m_RMSDatabase.table( "view_SwitchUsers2" );
RWDBSelector selRecord = m_RMSDatabase.selector();
selRecord << tblSwitchUsers ["Signature"];
selRecord.where( tblSwitchUsers ["SID"] == s );
RWDBReader rdrRecord1 = selRecord.reader(theConnection);
if(rdrRecord1 ())
{
rdrRecord1 >> blob;
result = true;
}
else
{
RWDBStatus theStatus = rdrRecord1.status();
TraceStr("FindSignature() - failed to execute!");
TraceStr("ErrorCode = %d,ErrorMsg = %s ", theStatus.errorCode(), theStatus.message() );
TraceStr("VendCode1 = %d,VendCode2 = %d ", theStatus.vendorError1(), theStatus.vendorError2() );
TraceStr("VendMsg1 = %s,VendMsg2 = %s ", theStatus.vendorMessage1(), theStatus.vendorMessage2() );
return false;
}
}
Любые идеи приветствуются!
2 ответа
Ну, я не могу точно сказать, почему я получил этот результат. Я могу сказать, что я управлял точно таким же SQL под тем же действием пользователя в Management Studio (это БД SQL Server 2008R2), и все работало на отлично...
Интересно (всегда есть один из этих "интересных" поворотов, да?) Представление, выполняемое в БД, к которой мы подключены, фактически возвращает запрашиваемые данные из полностью определенной таблицы в другую БД на том же сервере. Этот просмотр / запрос работал со всеми "старыми" записями, но две недавно добавленные вызывали проблему. Но проблема возникала только тогда, когда запрос был выполнен с библиотекой DBTools...
Я немного изменил представление (добавил WITH (NOLOCK), чтобы сделать его более эффективным, так как нет вероятности грязного чтения), и внезапно проблема ушла. Я подозреваю, что изменение его могло как-то повлиять на план доступа?
Я просто в восторге, проблема ушла. За десять лет использования этого кода, и я никогда не видел такого результата... Хотел бы я точно знать, что его вызвало и что исправило, но, вероятно, никогда не будет...
Конец выборки устанавливается как состояние, когда больше нет результатов для чтения из базы данных.
Вы уверены, что ваш запрос не возвращает пустой набор результатов?