プロが教える店舗&オフィスのセキュリティ対策術

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(...){}
}
}

A 回答 (1件)

アサートが発生した時に、[再試行]ボタンをクリックすれば、該当するソースファイルが表示されます。


ASSERT()の中に記述されている条件が満たされていないので、それを満たすようにしてください。直前に、何を判定するためのアサートかコメントが書かれている場合もあります(英語ですが)

提示されたソースでは、定義されていないものがあるので、細かい内容は判断できません。
_Tマクロの使い方も変だし。

この回答への補足

落ちた場所は、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文を取得させようとして落ちています。

そもそも、このような書き方はできるのでしょうか?
ネット検索しても事例がなくて。。。。

補足日時:2011/08/08 20:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!