0

わかりました、私は何年もコーディングしていないライブラリについてのこの質問で私の仕事をデートしています... Roguewave の DBTools++ を使用して Visual Studio 6.0 C++ で書かれた 1990 年代後半から生産されているコードがあります。

突然、特定のケースでクエリが失敗し、RWDBStatus がエラー コード 9 を示し、メッセージは [ENDOFFETCH} フェッチの終了です。以下のクエリを適切なキーで実行しようとすると、この奇妙なエラーが発生します。注-最初のクエリが値を返した場合にのみ実行されるため、失敗したのは2番目のクエリのようですが、どのクエリが失敗しているかをより具体的にするようにコードを変更します...

それで、私の質問は、このコンテキストで「フェッチの終わり」が何を意味するのか知っている人はいますか? 現在、これを探す場所がわかりません...エラーメッセージは次のとおりです。コードは以下のとおりです...

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

なぜこのような結果になったのか、はっきりとは言えません。Management Studio (SQL Server 2008R2 DB) で同じユーザー アカウントでまったく同じ SQL を実行したと言えますが、すべてが完全にうまく機能しました...

興味深いことに (これらの「興味深い」ひねりの 1 つが常にありますよね?) 接続している DB で実行されているビューは、実際には、同じサーバー上の別の DB にある完全修飾テーブルからクエリされたデータを返しています。このビュー/クエリはすべての「古い」レコードで機能しましたが、最近追加された 2 つのレコードが問題を引き起こしていました。しかし、問題はDBToolsライブラリでクエリが実行されたときにのみ発生していました...

ビューを少し変更し (ダーティ リードの可能性がないため、より効率的にするために WITH (NOLOCK) を追加しました)、突然問題はなくなりました。それを変更する行為がアクセスプランに何らかの影響を与えたのではないかと思いますか?

問題が解決したことを喜んでいます。このコードを 10 年以上使用してきましたが、この結果を見たことがありません...何が原因で何が修正されたのかを正確に知りたいのですが、おそらく決して...

于 2014-06-05T18:40:58.217 に答える
0

データベースから読み取る結果がなくなると、フェッチの終了がステータスとして設定されます。

クエリが空の結果セットを返していませんか?

于 2014-06-05T16:18:48.437 に答える