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++