「MFCとデータベース - CRUDの実行」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

227行目: 227行目:


== UPDATE / INSERT / DELETE ==
== UPDATE / INSERT / DELETE ==
ロールバック処理自体も失敗する可能性があるため、2重のtry-catch構造を使用することにより、ロールバック処理中のエラーも適切に処理できる。<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  void CSampleDlg::OnBnClickedQueryButton2()
  // 接続文字列の生成
{
CString strCon = _T("DSN=MS Access 97 Database;UID=Admin;PWD=");
    // 接続文字列生成
CDatabase db;
    CString strCon = "DSN=MS Access 97 Database;UID = Admin; PWD = ";
bool bTransStarted = false;  // トランザクションの状態を追跡するフラグ
   
   
    CDatabase db;
try {
     // 接続
     // 接続
     db.OpenEx(_T( strCon ), CDatabase::noOdbcDialog);
     if (!db.OpenEx(strCon, CDatabase::noOdbcDialog)) {
     // db.OpenEx(_T( strCon ), CDatabase::openReadOnly | CDatabase::noOdbcDialog); // 読み込み専用
      AfxMessageBox(_T("データベース接続に失敗しました"));
     // CDatabase::openReadOnly    データソースを読み取り専用で開く
      return -1;
     // CDatabase::noOdbcDialog    必要な情報が提供されているかに関わらず、ODBC接続のダイアログ ボックスを表示しない
    }
     // CDatabase::forceOdbcDialog  ODBC接続のダイアログボックスを常に表示する
     // トランザクション開始
    db.BeginTrans();
    bTransStarted = true;
    // SQLコマンドの実行
    db.ExecuteSQL(_T("create table test(a text, b text)"));
     // db.ExecuteSQL(_T("insert into test(a,b) values('inaba','minoru')"));
     // db.ExecuteSQL(_T("delete from test where a='inaba'"));
     // db.ExecuteSQL(_T("DROP TABLE test"));
   
   
     // 実行
     // トランザクションのコミット
     db.BeginTrans(); // トランザクション開始
     db.CommitTrans();
     try
     bTransStarted = false;
    {
}
      db.ExecuteSQL("create table test(a text, b text)");                  // 各種SQLコマンドの実行 複数実行可能
catch (CDBException *e) {
      // db.ExecuteSQL("insert into test(a,b) values('inaba','minoru')");  // 各種SQLコマンドの実行 複数実行可能
    // データベース固有のエラー処理
       // db.ExecuteSQL("delete from test where a='inaba'");               // 各種SQLコマンドの実行 複数実行可能
    if (bTransStarted) {
       // db.ExecuteSQL("DROP TABLE test");                                 // 各種SQLコマンドの実行 複数実行可能
       try {
          db.Rollback();
       }
      catch (...) {
          AfxMessageBox(_T("ロールバック中にエラーが発生しました"));
      }
     }
     }
     catch(...)
     // SQLでエラーが発生した場合はここで捕捉できる
    CString strError;
       // メモリリークのように見えるがODBCドライバが自動的に解放する
    strError.Format(_T("データベースエラー: %s"), e->m_strError);
     AfxMessageBox(strError);
    e->Delete();
}
catch (...) {
     // その他の予期せぬエラー処理
    if (bTransStarted) {
      try {
          db.Rollback();
      }
       catch (...) {
          AfxMessageBox(_T("ロールバック中にエラーが発生しました"));
      }
     }
     }
 
     db.CommitTrans(); // トランザクションの完了
     AfxMessageBox(_T("予期せぬエラーが発生しました"));
 
    db.Close();
  }
  }
// データベースを閉じる
if (db.IsOpen()) db.Close();
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>