• 締切済み

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文を取得させようとして落ちています。 そもそも、このような書き方はできるのでしょうか? ネット検索しても事例がなくて。。。。

関連するQ&A

  • データセットを選択するダイアグラムが表示される

    db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); 上記のような設定にしているのに、データセットを選択するダイアグラムが表示されてしまいます。 ただし、表示されないケースもあります。 while文で、 rs2.Open( CRecordset::forwardOnly, _T("select * from mac3data where read_flg = 0 order by seq") ); を数回実行するために、一度目のrs2.Openで読み込んだデータがすべて処理し終えたら、 rs2.Close() を行い、次に、 db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); CRecordset rs2( &db2 ); を行ったときに、ダイアログが表示されます。 一度目の db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); のときはダイアログは表示されません。 2度目の処理のときに表示されたダイアグラムでデータセットを選択すれば、処理としては問題なくできるのですが、なぜ、2度目のときにダイアグラムが表示されるのでしょうか? 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() )   中略 rs2.MoveNext(); } db2.Close(); db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); ←2回目のときに表示される CRecordset rs2( &db2 ); }

  • Debug Assertion Failed

    前回フォルダの中のフォルダの中のファイル検索について質問させていただきましたが再帰を使えというアドバイスをいただきVC++6.0のMFCダイアログベースにて 【InitDialog内】 if(int p=0; p<=argc;p++){ test(__argv[p]); } void ●Dlg::test(CString strFolder) { CFileFind find; CString Newstr=strFolder+_T("\\*.*"); if(find.FindFile(Newstr)) { int i=1; while(i) { if(strFolder==""){ return 0; } i=find.FindNextFile(); if(find.IsDots()){ continue; } if(find.IsDirectory()){ test(find.GetFilePath()); } CString filename=strFolder+"\\"+find.GetFileName(); m_Ary.Add(filename); find.close(); } } } ※m_Aryは●Dlgクラスのメンバ変数 CStringArray m_Ary; これを実行すると Debug Assertion Failedが出てきて デバッグを押すと BOOL CFileFind::FildNextFile() { →ASSERT(m_hContext !=NULL) →の所でひっかかってるようです。 どうすれば直りますか?

  • 文字の連結がうまくいかない

    CString SQL_st; CString SQL_and; CString SQL_end; CString SQL_update; SQL_st = "update mac3data set read_flg = 1 where (seq >= "; SQL_and = ") and (seq <= "; SQL_end = ")"; SQL_update = SQL_st + st_seq + SQL_and + en_seq + SQL_end; 上記のように連結して実行すると、SQL_update には、 update mac3data set read_flg = 1 where (seq >= 1.00 までしか入っていません。 SQL_and 以後の文字が連結できません。 どこに問題があるのでしょうか? st_seq には、1.00 en_seq には、89.00 が入っています。

  • Debug Assertion Failed?

    プログラムを実行したら、 Debug Assertion Failed Expressin:(stream!=NULL) For information on how your program can cause an assertion failure, see the Visual C++ documentation asserts. (Press Retry to debug the application) と表示されるエラーが発生しました。(添付画像参照) エラーの対処方法がわかりません。 ご存知の方がいたら教えていただけないでしょうか? なお、プログラムでは複数のバイナリーデータから必要な情報を抽出、計算して、各バイナリーデータごとにCSVファイルにデータを出力していました。 また、特定のファイルでエラーが発生するわけではありません。 よろしくお願いします。

  • Debug Assertion Failed

    パソコンを今朝起ちあげたら Debug Assertion Failed Program: \controlhandler.cpp Line: 102 visual C++ documentation on assert と出ました。 以来デスクトップのタスクバーやスタートボタンのデザインが変わっていたり、 インターネットにアクセスできなくなったりと、困っています。 パソコン初心者です。 どうか助言を頂けたら幸いです。

  • ADOのMoveNextでアプリケーションエラー

    いつもお世話になってます。 質問が下手で申し訳ございません。 ADOでORACLEに接続し、SELECTした結果をCSVへ登録する処理を作成してますが、ADOのMoveNextでアプリケーションエラーが毎回発生します。 そこで、エラーの調査方法を教えて下さい。 環境 OS:NT4.0 SP6 AP:VB6.0 SP5 DB:ORACLE 8.1.7 下記にソースを記述します。 Dim pCon As New ADODB.Connection Dim rs As New ADODB.Recordset pCon.Open "DSN=DSN名;uid=UID名;pwd=PASSWORD" Set rs.ActiveConnection = pCon strSQL = "select * from テーブル名" rs.Open strSQL, pCon, adOpenStatic, adLockReadOnly, adCmdText intFileNo = FreeFile Open CSVファイル For Output As #intFileNo Do Until rs.EOF CSVファイルへの出力処理ですが、   エラー調査のため、条件付きIFで処理を   飛ばしています。 rs.MoveNext Loop Close intFileNo rs.Close 実際には、Selectした内容をMoveNextしているだけなんですが。。。 どうかよろしくお願いします。

  • ODBCでMoveNextがうまく動作しないようなのですが

    まだVB歴1年ないので説明もうまくできないかも知れませんが どなたか教えていただければ助かります。 Dim cn as ADODB.Connection Dim rs as ADODB.Recordset Set cn = New ADODB.Connection cn.IsolationLevel = adXactRepeatabelRead cn.Open ***** Set rs = New ADODB.Recordset rs.CursorType = adOpenDynamic rs.LockType = asLockPessimistic rs.ActiveConnection = cn rs.Open ***** 上記のように設定したのち データ読み込み rs.MoveFirst Do until rs.EOF aaa = rs.Fields("ID").Value    中略 rs.MoveNext Loop ファイルクローズして他の処理したのち 再びファイルオープンして rs.MoveFirst For *** Set rs = cn.Execute("UPDATE テーブル名 SET ID = ***** ") 中略 rs.MoveNext Next *** ファイルクローズ 上記のMoveNextがおかしいと思うのですが 他のところかもしれませんが悩んでいます。 この内容でわかっていただけるか心配ですが よろしくお願いします。

  • 全角文字が???になる

    コマンドプロンプトからクエリを発行したときは問題なく表示されるんですが、ASPからだと全角文字が???になってしまいます。 また、NULL項目を除外したいので Where DeleteFlg is Null という条件を付加したんですが、 今度は何も表示されなくなります。 原因等、わかるかたがいましたら、お力をお貸しください。 Set db=Server.CreateObject("ADODB.Connection") db.Open "dsn=AIU;Server=172.17.0.110; Database=db1; UID=root; PWD=admin;" db.CursorLocation = 3 Set rs = db.Execute("Select * From table1") Do While Not(rs.EOF) Response.Write rs.Fields.Item("koumoku1") & vbNewLine Loop 環境 Windows2003Serverエンタープライズ MySQL5.0 MySQL ODBC 3.51 Driver IE6.0

    • ベストアンサー
    • MySQL
  • VBA ADOに関して

    お世話になります。 VBAに関して質問があります。 ADOでDBから値を取得する際、 TEXT型の値が全く取れてきません。 どなたか取得方法をご教授下さい。 宜しくお願い致します。 DB:Sybase OS: RedHat 8.0 Dim rs As ADODB.Recordset Dim sql As String sql = "select * from " & tblName //dbはADODB.Connection Set rs = db.Execute(sql) Do While Not rs.EOF //ここでTEXT型だと、取れてきません。  If IsNull(rs.Fields('Field名').Value) Then End If rs.MoveNext Loop

  • クエリで求めた空き番を登録したい

    詰まってしまったので質問させていただきます。 登録番号の空き番号を求めることが出来るクエリを使い空いている番号を埋めたいと思います。 個人T…テーブル。空き番号をもつ"登録番号"フィールドと空き番号がない綺麗な"連番"フィールドを持つ ZZZZ空き番号抽出クエリ…"登録番号"の空き番号を昇順で並べた"仮想ID"がある Private Sub Sample6() Dim Db As DAO.Database Dim rs As DAO.Recordset Dim i As Variant Dim J As Variant Set Db = CurrentDb Set rs = Db.OpenRecordset("個人T") J = Right(DMax("連番", "個人T"), 4) i = 0 While i < J rs.AddNew i = DMin("仮想ID", "ZZZZ空き番号抽出クエリ") →→ rs(登録番号) = "ZZZZ" & i rs.Update rs.MoveNext Wend End Sub これで実行すると「このコレクションには項目がありません。」 と「rs(登録番号) = "ZZZZ" & i」がエラーになってしまいます。 書き方自体が悪いのはものすごく分かるのですが・・・ どこを直したら正常に空き番号を埋めることができるでしょうか?

専門家に質問してみよう