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

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

 
(同じ利用者による、間の6版が非表示)
43行目: 43行目:
<br>
<br>
==== ODBCデータソースアドミニストレーターの起動方法 ====
==== ODBCデータソースアドミニストレーターの起動方法 ====
* [コントロールパネル] - [管理ツール] - [ODBC データ ソース (32ビット)]を選択する。
* [コントロールパネル] - [Winodwsツール] または [管理ツール] - [ODBC データ ソース (64ビット)] または [ODBC データ ソース (32ビット)]を選択する。
* [Ctrl] - [R]キーを同時押下して、ODBCと入力・検索する。
* [Ctrl] - [R]キーを同時押下して、<u>"ODBC"</u>と入力・検索する。
* 64ビットアプリケーションの場合は、C:\Windows\SysWOW64\odbcad32.exeを実行する。
* 64ビットアプリケーションの場合は、C:\Windows\SysWOW64\odbcad32.exeを実行する。
<br>
<br>
==== システムDSNの追加手順 ====
==== システムDSNの追加手順 ====
# [システムDSN]タブを選択する。
# [システムDSN]タブを選択する。
168行目: 169行目:
<br><br>
<br><br>


== SELECT ==
== レコードの抽出 ==
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  #include <afxdb.h>
  #include <afxdb.h>
 
  void CSampleDlg::OnBnClickedQueryButton1()
  void CSampleDlg::OnBnClickedQueryButton1()
  {
  {
226行目: 227行目:
<br><br>
<br><br>


== ロールバック ==
== レコードの挿入 ==
==== 基本的な挿入 ====
<syntaxhighlight lang="c++">
#include <afxdb.h>
// データベース接続文字列の設定
// MS Access 97データベースに接続する場合の接続文字列
CString strCon = "DSN=MS Access 97 Database;UID=Admin;PWD=";
// 注意 : Windows認証でSQLServerを使用する場合は以下の接続文字列を使用
// CString strCon = "DSN = SQLServerTest;";
// データベースオブジェクトの作成と接続
CDatabase db;
db.OpenEx(_T(strCon), CDatabase::noOdbcDialog);
// データベース接続オプションの説明:
// CDatabase::noOdbcDialog - ODBCの接続ダイアログを表示せずに接続を試みる
// CDatabase::forceOdbcDialog - 常にODBCの接続ダイアログを表示する
// CDatabase::openReadOnly - 読み取り専用モードでデータベースを開く
try {
    // トランザクションの開始
    // データの整合性を保つため、INSERT操作はトランザクション内で実行することを推奨
    db.BeginTrans();
    // 日付文字列のフォーマット(YYYY-MM-DD HH:MM:SS)
    COleDateTime currentDateTime = COleDateTime::GetCurrentTime();
    CString strDateTime = currentDateTime.Format(_T("%Y-%m-%d %H:%M:%S"));
 
    // 数値の金額をフォーマット (小数点以下2桁)
    double dblAmount = 1234.56;
    CString strAmount;
    strAmount.Format(_T("%.2f"), dblAmount);
    // バイナリデータの準備 (例 : 16進数データ)
    BYTE binaryData[] = {0x01, 0x02, 0x03, 0x04};
    CString strBinary;
    for (int i = 0; i < sizeof(binaryData); i++) {
        CString temp;
        temp.Format(_T("%02X"), binaryData[i]);
        strBinary += temp;
    }
 
    // INSERT文の実行
    // 注意:実際のテーブル構造に合わせてカラム名と値を設定する必要があります
    CString strSQL;
    strSQL.Format(_T("INSERT INTO test (column1, column2, column3) VALUES ('%s', %d, '%s')"),
      _T("サンプル値1"),  // 文字列型カラムの例
      123,              // 数値型カラムの例
      _T("サンプル値2"));  // 文字列型カラムの例
    // SQL文の実行
    // ExecuteSQL関数を使用してINSERT文を実行
    db.ExecuteSQL(strSQL);
    // トランザクションのコミット
    // エラーが発生しなかった場合、変更を確定
    db.CommitTrans();
}
catch (CDBException *e) {
    // データベースエラーの処理
    // エラーメッセージの取得と表示
    TRACE(_T("データベースエラー: %s\n"), e->m_strError);
    // トランザクションのロールバック
    // エラーが発生した場合、変更を取り消し
    db.Rollback();
    // 例外オブジェクトの解放
    e->Delete();
}
catch (...) {
    // その他の予期しないエラーの処理
    TRACE(_T("予期しないエラーが発生しました\n"));
    // トランザクションのロールバック
    db.Rollback();
}
// データベース接続のクローズ
db.Close();
</syntaxhighlight>
<br>
==== 各データ型の挿入 ====
* VARCHAR / NVARCHAR
*: 文字列型 (NVARCHARはUnicode対応)
* 数値型 (INT, BIGINT, SMALLINT, TINYINT)
*: 適切な範囲の値を使用する。
* 小数点数 (DECIMAL, FLOAT)
*: 精度を考慮したフォーマット
* 日付時刻型 (DATE, DATETIME, DATETIME2, TIME)
*: COleDateTimeクラスを使用して現在日時を取得する。
*: 各日付時刻型に応じた適切なフォーマットを適用する。
* バイナリ型
*: バイト配列を16進数文字列に変換して挿入する。
*: 0xプレフィックスを付加して、SQLに組み込む。
* UNIQUEIDENTIFIER
*: GUID形式の文字列
*  Unicode対応
*: NVARCHAR型には、N'文字列'の形式で値を指定する。
*: 日本語等の全角文字も正しく扱うことが可能である。
<br>
<syntaxhighlight lang="c++">
// INSERT文の作成
CString strSQL;
strSQL.Format(_T("INSERT INTO SampleTable ")
              _T("(VarcharColumn, ")    // VARCHAR型
              _T("NvarcharColumn, ")    // NVARCHAR型
              _T("IntColumn, ")          // INT型
              _T("BigIntColumn, ")      // BIGINT型
              _T("SmallIntColumn, ")    // SMALLINT型
              _T("TinyIntColumn, ")      // TINYINT型
              _T("BitColumn, ")          // BIT型
              _T("DecimalColumn, ")      // DECIMAL型
              _T("FloatColumn, ")        // FLOAT型
              _T("DateColumn, ")        // DATE型
              _T("DateTimeColumn, ")    // DATETIME型
              _T("DateTime2Column, ")    // DATETIME2型
              _T("TimeColumn, ")        // TIME型
              _T("BinaryColumn, ")      // BINARY型
              _T("UniqueIdentifier) ")  // UNIQUEIDENTIFIER型
              _T("VALUES ")
              _T("('%s', ")              // VARCHAR
              _T("N'%s', ")              // NVARCHAR(Unicode文字列)
              _T("%d, ")                // INT
              _T("%I64d, ")              // BIGINT
              _T("%d, ")                // SMALLINT
              _T("%d, ")                // TINYINT
              _T("%d, ")                // BIT
              _T("%s, ")                // DECIMAL
              _T("%f, ")                // FLOAT
              _T("'%s', ")              // DATE
              _T("'%s', ")              // DATETIME
              _T("'%s', ")              // DATETIME2
              _T("'%s', ")              // TIME
              _T("0x%s, ")              // BINARY
              _T("'%s')"),              // UNIQUEIDENTIFIER
              // 各データ型の値を指定
              _T("テスト文字列"),      // VARCHAR値
              _T("Unicode文字列"),    // NVARCHAR値
              12345,                  // INT値
              9223372036854775807LL,  // BIGINT値 (最大値)
              32767,                  // SMALLINT値
              255,                    // TINYINT値
              1,                      // BIT値 (0または1)
              strAmount,              // DECIMAL値
              123.456789,            // FLOAT値
              currentDateTime.Format(_T("%Y-%m-%d")),          // DATE値
              strDateTime,                                    // DATETIME値
              strDateTime,                                    // DATETIME2値
              currentDateTime.Format(_T("%H:%M:%S.0000000")),  // TIME値
              strBinary,                                      // BINARY値
              _T("12345678-1234-1234-1234-123456789012")      // UNIQUEIDENTIFIER値
);
</syntaxhighlight>
<br>
==== NULL値を含む挿入 ====
NULL値を許可するカラムの場合、明示的にNULLが指定できる。<br>
NULL値を含む専用のINSERT文を追加する。<br>
<br>
<syntaxhighlight lang="c++">
CString strSQLWithNull;
strSQLWithNull.Format(_T("INSERT INTO SampleTable ")
    _T("(VarcharColumn, IntColumn) ")
    _T("VALUES ")
    _T("(NULL, NULL)"));
</syntaxhighlight>
<br><br>
 
== トランザクション ==
ロールバック処理自体も失敗する可能性があるため、2重のtry-catch構造を使用することにより、ロールバック処理中のエラーも適切に処理できる。<br>
ロールバック処理自体も失敗する可能性があるため、2重のtry-catch構造を使用することにより、ロールバック処理中のエラーも適切に処理できる。<br>
<br>
<br>