📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の6版が非表示) | |||
| 43行目: | 43行目: | ||
<br> | <br> | ||
==== ODBCデータソースアドミニストレーターの起動方法 ==== | ==== ODBCデータソースアドミニストレーターの起動方法 ==== | ||
* [コントロールパネル] - [管理ツール] - [ODBC データ ソース (32ビット)]を選択する。 | * [コントロールパネル] - [Winodwsツール] または [管理ツール] - [ODBC データ ソース (64ビット)] または [ODBC データ ソース (32ビット)]を選択する。 | ||
* [Ctrl] - [R] | * [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> | ||
== | == レコードの抽出 == | ||
<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> | ||