MFC + ODBCを使ったデータベースアクセス
@ODBCアドミニストレータでのデータソース登録
Aアプリケーションの作成
#include <afxdb.h> //←追加します。
//SELECTを実行する場合--------------------------------------------------------------------------------------
void ***Dlg::OnBnClickedButton1()
{
//接続文字列生成
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();
}
//値が帰ってこないSQLを発行する場合--------------------------------------------------------------------------------------
void ***Dlg::OnBnClickedButton3()
{
//接続文字列生成
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();
}
○SQLServerなどで SELECT 文を使用すると、上記のコードでは datetime などが表示できない場合があります。---------------------------------
そのため、GetFieldValue の引数に CDBVariant を使います。
CDBVariant のメンバ
データ メンバ-----------------------------------------
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 型のオブジェクトへのポインタ。
CDBVariant::m_dwType-----------------------------------
CDBVariant オブジェクトの共用体データ メンバに現在格納されている値のデータ型が入ります。
共用体にアクセスする前に、共用体のどのデータ メンバにアクセスするかを決めるために、m_dwType の値をチェックする必要があります。次の表は、m_dwType の値と対応する共用体データ メンバの一覧です。
m_dwType 共用体データ メンバ
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
-------------------------------------------------------
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(...){}//SQL文がエラーを発生したときはここで捕まりますがメモリリークのように見えますが、ODBCドライバのほうでそのうち自動的に解放されるみたいです
rs.Close();
db.Close();
▲トップページ
>
Windows と C++