VC++ DBアクセス( lightbox ライブラリでダイアログ処理 )

  lightbox ライブラリのインストールと スケルトンのダウンロード



このダイアログアプリケーションは、デスクトップをオーナーウインドウとした、
printf 可能なコンソールアプリケーションです。
( データベースアクセス可能なようにカスタマイズしています )

printf 可能なダイアログアプリケーションプロジェクトの設定は こちら を参照してください。

http://winofsql.jp/download/lightbox.lzh をダウンロードして解凍後、setup.exe を実行します。
うまくいかない場合は、ヘッダーファイルとライブラリを VC++ の該当ディレクトリに直接コピーします。

http://winofsql.jp/download/printfDialog.lzh がスケルトンです。

printfDialog.dsw を開いて下さい。

初期状態では、C:\TEMP\ado\販売管理B.mdb を開きます。

↓販売管理B.mdb
http://winofsql.jp/download/hanbaib.lzh

  
#include <afx.h>
#include <lightbox.h>
#include "resource.h"
#include "db.h"

#pragma comment( lib, "lightbox.lib" )
#pragma comment( lib, "shlwapi.lib" )

LRESULT CALLBACK PrintfDialog( HWND, UINT, WPARAM, LPARAM );

char ConnectionString[1024] =
"Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=C:\\TEMP\\ado\\販売管理B.mdb;";

ADO_MAIN(ConnectionString)

	DialogBox(
		NULL,
		(LPCTSTR)IDD_DIALOG,
		::GetDesktopWindow(),
	(DLGPROC)PrintfDialog);

ADO_END


LboxDlg *Dlg;
// *********************************************************
// ダイアログ
// *********************************************************
LRESULT CALLBACK PrintfDialog(
HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
	switch( message ) {
		case WM_INITDIALOG:

			Dlg = new LboxDlg( hDlg );
			Dlg->ChangeIcon( 104 );
			Dlg->StatusCreate( 0 );

			// ダイアログを通常ウインドウのスタイルに変更
			Dlg->ChangeStyle(
				WS_MINIMIZEBOX |
				WS_SYSMENU |
				WS_SIZEBOX |
				WS_MAXIMIZEBOX,
				0 
			);
			Dlg->ChangeExStyle( WS_EX_APPWINDOW, 0 );

			return TRUE;

		case WM_COMMAND:
			if( LOWORD(wParam) == IDOK ) {
				printf("表示\n");
				return TRUE;
			}
			if( LOWORD(wParam) == IDCANCEL ) {
				EndDialog(hDlg, LOWORD(wParam));
				delete Dlg;
				return TRUE;
			}
			break;
	}
	return FALSE;
}
  





  リストボックスにテーブル一覧を表示する



WM_INITDIALOG で呼び出します
呼び出しは、引数の定義が実体参照で記述されている為、実体渡しする為に * を Dlg の前に付けます。

LoadTableList( *Dlg );

  
void LoadTableList( LboxDlg &Dlg )
{
	Dlg.ListReset( IDC_LIST1 );

	// テーブル一覧の開始
	_variant_t vValue;
	_bstr_t StringBuffer;

	pRs = pCn->OpenSchema( adSchemaTables );

	while( !(pRs->EndOfFile) ) {

			vValue = pRs->Fields->GetItem("TABLE_NAME")->Value;
			StringBuffer.operator = (vValue);
			Dlg.ListAdd( IDC_LIST1, (LPTSTR)StringBuffer );
			pRs->MoveNext();

	}

	pRs->Close();

}
  





  CSV 出力

出力するファイルの参照
  
if( LOWORD(wParam) == IDC_BUTTON2 ) {
	LboxCommdlg Comm;
	LboxString Path;
	Comm.lpstrFilter = "CSV,*.csv";
	if ( Comm.SaveFileName( Path ) ) {
		Dlg->EditSetText( IDC_EDIT1, Path );
	}
}
  

文字列の処理として、4種類のオブジェクトを使用しています。

1) CString
大きなバッファを確保するのに使用しています。文字列を処理する為の本来の CString の機能は使用していません。

2) LboxString
タイアログ処理に lightbox ライブラリを使用している為、通常の文字列処理をこのクラスで行っています。

3) _variant_t
データベース処理に要求されるデータ型として使用しています。本来いろいろな型を持ちますが、
ここでは文字列として使用されています。

4) _bstr_t
データベースより戻される文字列の為の型として使用しています。
実際に使う場合は (LPTSTR) にキャストして使用します。

CSV出力
  
void CsvOut( LboxDlg &Dlg )
{
	LboxString Work;
	LboxString Table;

	// 出力ファイルパス
	Dlg.EditGetText( IDC_EDIT1, Work );
	if ( Work == "" ) {
		Dlg.MsgOk( "出力ファイルを指定して下さい   " );
		return;
	}

	// 対象テーブル
	if ( 0 >= Dlg.ListSelectedGetText( IDC_LIST1, Table ) ) {
		Dlg.MsgOk( "対象テーブルを選択して下さい   " );
		return;
	}

	// SQL
	Table = "select * from " + Table;

	// データ取得の為の大きなバッファを CString で確保
	CString strBuffer;
	LPTSTR szBuff = strBuffer.GetBufferSetLength( 4096 );

	// データベース処理用バッファ
	_variant_t VBuff;
	_bstr_t BBuff;

	// Query は variant で渡す
	VBuff = (LPTSTR)Table;

	ADO_QUERY(VBuff)

	// ファイルポインタを定義
	FILE *fp;

	// ファイルを開く
	fp = fopen( (LPTSTR)Work, "wt" );
	if ( NULL == fp ) {
		Dlg.MsgOk( "%s を OPEN できませんでした   ", (LPTSTR)Work );
		return;
	}

	// ループ用変数
	int i,nField;

	// フィールド数取得
	nField = pRs->Fields->Count;

	// チェックボックスの処理
	if ( Dlg.ButtonIsCheck( IDC_CHECK1 ) ) {
		// 列名取得
		VBuff = pRs->Fields->GetItem((LONG)0)->Name;
		// bstr に変換
		BBuff = VBuff;
		// LboxString の ファイル出力用バッファにセット
		Work = (LPTSTR)BBuff;

		for( i = 1; i < nField; i++ ) {
			VBuff = pRs->Fields->GetItem((LONG)i)->Name;
			BBuff = VBuff;
			Work += ",";
			Work += (LPTSTR)BBuff;
		}
		Work += "\n";

		// ファイル書き込み
		fputs( (LPTSTR)Work, fp );
	}

	QUERY_LOOP

		// 最初のフィールド
		QUERY_GET(((LONG)0),szBuff)
		Work = szBuff;

		for( i = 1; i < nField; i++ ) {
			QUERY_GET(((LONG)i),szBuff)
			Work += ",";
			Work += szBuff;
		}
		Work += "\n";
		fputs( (LPTSTR)Work, fp );

	QUERY_END

	// 出力ファイルを閉じる
	fclose( fp );
	// CString で確保していた領域を開放
	strBuffer.ReleaseBuffer();
	// レコードセットを開放
	pRs->Close();

	Dlg.MsgOk( "CSV 出力が終了しました   " );

}
  












  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ