0

好的,我正在与这个关于我多年未编写代码的库的问题约会我的工作......我有自 1990 年代后期以来一直在生产中的代码,这些代码使用 Roguewave 的 DBTools++ 用 Visual Studio 6.0 C++ 编写。

突然,对于特定情况,查询失败并且 RWDBStatus 指示错误代码 9,消息是 [ENDOFFETCH} End of Fetch。当我尝试使用适当的键运行下面的查询时,我收到了这个奇怪的错误。注意 - 我还将更改代码以更具体地说明哪个查询失败,尽管它似乎是第二个失败的查询,因为它只有在第一个查询返回一个值时才会执行......

所以,我的问题是——有谁知道在这种情况下“提取结束”是什么意思?它目前没有让我知道在哪里寻找这个......这是错误消息,代码如下......

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;
    }

}

任何见解表示赞赏!

4

2 回答 2

0

当没有更多的结果要从数据库中读取时,提取结束被设置为状态。

您确定您的查询没有返回空结果集吗?

于 2014-06-05T16:18:48.437 回答
0

好吧,我不能确切地说我为什么会得到这个结果。我可以说我在 Management Studio(它是一个 SQL Server 2008R2 DB)中的同一个用户帐户下运行了完全相同的 SQL,并且一切都运行良好......

有趣的是(总是有这些“有趣的”转折,是吗?)在我们连接的数据库中执行的视图实际上是返回从同一服务器上另一个数据库中的完全限定表中查询的数据。此视图/查询适用于所有“较旧”记录,但最近添加的两个记录导致了问题。但问题仅在使用 DBTools 库执行查询时出现......

我稍微改变了视图(添加了 WITH (NOLOCK) 以使其更高效,因为没有脏读的可能性),突然问题就消失了。我怀疑更改它的行为可能会以某种方式影响访问计划?

我很高兴问题已经消失了。使用这段代码十多年了,我从来没有见过这个结果......希望我确切地知道是什么导致它以及修复它的原因,但可能永远不会......

于 2014-06-05T18:40:58.217 回答