MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MFCとデータベース - CRUDの実行のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MFCとデータベース - CRUDの実行
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == ここでは、MFCとミドルウェアであるODBCを使用したデータベースの更新処理を記載する。<br> 上記を使用したデータベースの更新手順は、以下の2つの項目からなる。<br> # '''ODBCアドミニストレータでのデータソース登録''' # '''データベースの操作''' <br><br> == サンプルコード == <big>'''SELECT文を発行する'''</big> <syntaxhighlight lang="cpp"> #include <afxdb.h> void CSampleDlg::OnBnClickedQueryButton1() { // 接続文字列生成 CString strCon = "DSN=MS Access 97 Database;UID=Admin;PWD="; // Windows認証でSQLServerを使用する場合 => CString strCon = "DSN = SQLServerTest;"; // 接続 CDatabase db; db.OpenEx( _T( strCon ), CDatabase::noOdbcDialog ); // db.OpenEx( _T( strCon ), CDatabase::openReadOnly | CDatabase::noOdbcDialog ); // 読み込み専用 // CDatabase::openReadOnly データソースを読み取り専用で開く // CDatabase::noOdbcDialog 必要な情報が提供されているかに関わらず、ODBC接続のダイアログボックスを表示しない // CDatabase::forceOdbcDialog ODBC接続のダイアログ ボックスを常に表示する // 実行 CRecordset rs( &db ); try { rs.Open( CRecordset::forwardOnly, _T("select * from test") );//SQLコマンドの実行 CODBCFieldInfo fi; short nFields = rs.GetODBCFieldCount(); //フィールド名を表示 if (!rs.IsEOF()) { for(short index = 0; index < rs.GetODBCFieldCount(); index++ ) { rs.GetODBCFieldInfo(index, fi); TRACE("%s\n",fi.m_strName); } } // 値を表示 while( !rs.IsEOF() ) { for(short index = 0; index < rs.GetODBCFieldCount(); index++) { CString strValue; rs.GetFieldValue(index, _T(strValue)); TRACE("%s\n",strValue); } rs.MoveNext(); } } catch(...) { // SQLがエラーを発生した場合はここで捕捉 // メモリリークのように見えるがODBCドライバが自動的に解放する } rs.Close(); db.Close(); } </syntaxhighlight> <br><br> <big>'''UPDATE / INSERT / DELETE文を発行する'''</big> <syntaxhighlight lang="cpp"> void CSampleDlg::OnBnClickedQueryButton2() { // 接続文字列生成 CString strCon = "DSN=MS Access 97 Database;UID = Admin; PWD = "; CDatabase db; // 接続 db.OpenEx(_T( strCon ), CDatabase::noOdbcDialog); // db.OpenEx(_T( strCon ), CDatabase::openReadOnly | CDatabase::noOdbcDialog); // 読み込み専用 // CDatabase::openReadOnly データソースを読み取り専用で開く // CDatabase::noOdbcDialog 必要な情報が提供されているかに関わらず、ODBC接続のダイアログ ボックスを表示しない // CDatabase::forceOdbcDialog ODBC接続のダイアログボックスを常に表示する // 実行 db.BeginTrans(); // トランザクション開始 try { db.ExecuteSQL("create table test(a text,b text)"); // 各種SQLコマンドの実行 複数実行可能 // db.ExecuteSQL("insert into test(a,b) values('inaba','minoru')"); // 各種SQLコマンドの実行 複数実行可能 // db.ExecuteSQL("delete from test where a='inaba'"); // 各種SQLコマンドの実行 複数実行可能 // db.ExecuteSQL("DROP TABLE test"); // 各種SQLコマンドの実行 複数実行可能 } catch(...) { // SQLでエラーが発生した場合はここで捕捉できる // メモリリークのように見えるがODBCドライバが自動的に解放する } db.CommitTrans(); // トランザクションの完了 db.Close(); } </syntaxhighlight> <br><br> == 注意点 == SQLServer等でSELECT文を発行すると、上記のコードではdatetime等が表示できない場合がある。<br> そのため、GetFieldValueの引数にCDBVariantを使用する。<br><br> <center>'''表1. CDBVariantのメンバ'''</center> <center> {| class="wikitable" |- ! メンバ変数名 !! データ型 |- | m_boolVal || BOOL |- | m_chVal || unsigned char |- | m_dblVal || double |- | m_dwType || DWORD(現在格納されている値のデータ型) |- | m_fltVal || float |- | m_iVal || short |- | m_lVal || long |- | m_pbinary || CLongBinaryオブジェクトへのポインタ |- | m_pdate || TIMESTAMP_STRUCTオブジェクトへのポインタ |- | m_pstring || CStringオブジェクトへのポインタ |} </center> <br> 上記に記載したCDBVariant::m_dwTypeにおいて、<br> CDBVariantオブジェクトの共用体データメンバに現在格納されている値のデータ型が入る。<br> 共用体にアクセスする前に、共用体のどのメンバにアクセスするかを決めるために、m_dwTypeの値をチェックする必要がある。<br> 次の表は、m_dwTypeの値と対応する共用体メンバの一覧である。<br> <center>'''表1. m_dwType共用体メンバ'''</center> <center> {| class="wikitable" |- ! 共用体データ型 !! 共用体データメンバ |- | DBVT_NULL || 有効な共用体メンバはなく、アクセスできません。 |- | DBVT_BOOL || m_boolVal |- | DBVT_UCHAR || m_chVal |- | DBVT_SHORT || m_iVal |- | DBVT_LONG || m_lVal |- | DBVT_SINGLE || m_fltVal |- | DBVT_DOUBLE || m_dblVal |- | DBVT_DATE || m_pdate |- | DBVT_STRING || m_pstring |- | DBVT_BINARY || m_pbinary |} </center> <br> <syntaxhighlight lang="cpp"> CString strCon = "DSN = SQLServerTest;"; CDatabase db; db.OpenEx(_T( strCon ), CDatabase::noOdbcDialog); CRecordset rs( &db ); try { rs.Open( CRecordset::forwardOnly, _T("select * from test") );//SQLコマンドの実行 // 値を表示 while(!rs.IsEOF()) { for(short index = 0; index < rs.GetODBCFieldCount(); index++) { CDBVariant val; rs.GetFieldValue( index,val); switch(val.m_dwType) { case DBVT_NULL : TRACE("NULL 無効の値\n"); break; case DBVT_BOOL : TRACE("m_boolVal BOOL 型\n"); TRACE("%d\n",val.m_boolVal); break; case DBVT_UCHAR : TRACE("m_chVal unsigned char 型\n"); TRACE("%s\n",val.m_chVal); break; case DBVT_SHORT : TRACE("m_iVal short 型\n"); TRACE("%d\n",val.m_iVal); break; case DBVT_LONG : TRACE("m_lVal long 型\n"); TRACE("%d\n",val.m_lVal); break; case DBVT_SINGLE : TRACE("m_fltVal float 型\n"); TRACE("%f\n",val.m_fltVal); break; case DBVT_DOUBLE : TRACE("m_dblVal double 型\n"); TRACE("%f\n",val.m_dblVal); break; case DBVT_DATE : TRACE("m_pdate TIMESTAMP_STRUCT 型のオブジェクトへのポインタ\n"); TIMESTAMP_STRUCT *pT; pT = val.m_pdate; TRACE("%d/%d/%d %d:%d:%d\n",pT->year,pT->month,pT->day,pT->hour,pT->minute,pT->second ); break; case DBVT_STRING : TRACE("m_pstring CString 型のオブジェクトへのポインタ\n"); TRACE("%s\n",*val.m_pstring); break; case DBVT_BINARY : TRACE("m_pbinary\n CLongBinary 型のオブジェクトへのポインタ"); break; default : break; } } rs.MoveNext(); } } catch(...) { } rs.Close(); db.Close(); </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:MFC]]
MFCとデータベース - CRUDの実行
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse