• 締切済み

Debug Assertion failed

VC++のSQL Server 2008 の処理中に、 Debug Assertion failed のエラーが発生します。 落ちている場所は、dbcore.cpp の中です。 デバッグトレースを見る限り、下記ソースの2回目のrs2.Open らしいところまで辿りましたが、 なぜ、2回目のrs2.Open で落ちるかの原因がわかりません。 CString strCon2="DSN=MAC3DB_DS;"; db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); CRecordset rs2( &db2 ); while(end_sw==0) { try{ rs2.Open( CRecordset::forwardOnly, _T("select * from mac3data where read_flg = 0 order by seq") ); while( !rs2.IsEOF() ) { for(int index = 0; index <= rs2.GetODBCFieldCount(); index++ ) { switch(index) { case 1 : rs2.GetFieldValue("seq", _T(str_seq));break; 中略 } 中略 rs2.MoveNext(); } }catch(...){} } }

みんなの回答

回答No.1

アサートが発生した時に、[再試行]ボタンをクリックすれば、該当するソースファイルが表示されます。 ASSERT()の中に記述されている条件が満たされていないので、それを満たすようにしてください。直前に、何を判定するためのアサートかコメントが書かれている場合もあります(英語ですが) 提示されたソースでは、定義されていないものがあるので、細かい内容は判断できません。 _Tマクロの使い方も変だし。

ichigo61
質問者

補足

落ちた場所は、dbcpore.cpp の中の ENSURE(!IsOpen()); で落ちました。 BOOL CRecordset::Open(UINT nOpenType, LPCTSTR lpszSQL, DWORD dwOptions) { ENSURE(!IsOpen()); ← ここで落ちた 記述したソースでは、while(end_sw==0)文の2回目のrs2.Openで落ちています。 CString strCon2="DSN=MAC3DB_DS;"; db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); CRecordset rs2( &db2 ); while(end_sw==0) {  try{  rs2.Open( CRecordset::forwardOnly, _T("select * from mac3data where read_flg = 0 order by seq") ); ← 2回目のwhile(end_sw==0)文でのループで落ちた for(int index = 0; index < rs2.GetODBCFieldCount(); index++ ) { 中略 } while( !rs2.IsEOF() ) { 中略 rs2.MoveNext(); } }catch(...){} } この処理で実現させたいことは、end_sw が、1 になるまで、select文を何度も実行させることです。end_sw が、1 になれば、db2.Close(); させます。 1回目のselect文は、複数行の取得でしたが、うまく処理していました。 1回目のselect文の複数行取得後、次のselect文を取得させようとして落ちています。 そもそも、このような書き方はできるのでしょうか? ネット検索しても事例がなくて。。。。