Delphi Programming / Object Pascal
[掲載 2007年11月01日] [更新 2015年09月30日] Delphi サンプルプログラム集 |
623_ADO で JET データベースのエクスポート |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE(UP1) Pro + Msjet40.dll 4.00.9756.0 |
|
623_ADO_mdbExport.zip [4,567 KB] 2015年09月30日版 (EXE 同梱) |
- 2010年05月27日
- エクスポート先の種類ごとのプロジェクトに分けた
- Windows 7 U64 + Delphi 2010(UP5) Proで動作確認
- 2015年09月30日
- Windows 7 U64(SP1) + Delphi XE(UP1) Proで動作確認
- コードの整備
|
ADO で JET データベースのデータをエクセルやテキストファイルに出力するサンプルです.
テキストファイルの場合,ADO ではデータの更新 (削除・追加等) ができないため,既にファイルが存在する時はそのファイルを削除しています.クエリの結果をエクスポートしたい場合は,SQL 文で次の様に指定できます. |
LstrSelect := 'SELECT * INTO ' + LFileName + ' IN '
+ AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM 食品カロリ表 WHERE 食品群 LIKE "%菜%" ';
LstrSelect := 'SELECT * INTO ' + LFileName + ' IN '
+ AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM (SELECT * FROM 食品カロリ表 WHERE 食品群 LIKE "%菜%" ) ';
このページのサンプルプログラムでは,下図のような JET データベースのデータをエクスポート先に出力します.また Paradox データベース以外のサンプルは,その下の図のような,全てボタン 1 つだけのプロジェクトとなっています. |
|
図1
エクスポートするデータ |
|
図2
設計時画面
- Paradox データベースへのエクスポートを除いて全て同じ
|
以下は,サンプルプログラム集の ADO 関係の記事へのリンクです. |
JET データベースのデータをエクセルのシートへ出力する例です. |
|
図3
実行結果
|
リスト3
JET データベースのデータをエクセルに出力 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ExtCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// FormCreate時に各種初期設定
// ADOConnecton1,ADOQuery1はFormに配置しデフォルトの状態で使用
// それ以外の設定はこのサンプルコード内で行っている
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.Connected := False;
ADOConnection1.KeepConnection := False;
ADOConnection1.LoginPrompt := False;
ADOConnection1.Mode := cmReadWrite;
ADOConnection1.Provider := 'Microsoft.Jet.OLEDB.4.0';
ADOConnection1.ConnectionString := 'Data Source=../DB_MDB/ForExport.mdb;';
ADOQuery1.Connection := ADOConnection1;
end;
//=============================================================================
// フォームを閉じたら接続を切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOConnection1.Connected := False;
end;
//=============================================================================
// JETデータベース表データをExcel(シート)へエクスポート
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LExcelPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//対象のExcelのブック
LExcelPath :='../Data/ADOTest.Xls';
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LExcelPath) then DeleteFile(LExcelPath);
//SQL文の作成
//ここではSheet1に出力
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO [Sheet1] IN '
+ AnsiQuotedStr(LExcelPath, '"') + ' '
+ AnsiQuotedStr('Excel 8.0;', '"');
LstrFrom := 'FROM 食品カロリ表 ORDER by キロカロリ ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
end.
02_CSV テキストファイルへのエクスポート ( スキーマ設定なし ) |
JET データベースのデータをカンマ区切りの CSVフ ァイルへ出力する例です.
CSV の第 1 行目にタイトルを出力します. |
|
図4
出力をテキストエディタで表示 |
リスト4
JET データベースのデータを CSV ファイルへ出力
Button2Click 以外のコードは上のサンプルと同じ |
//=============================================================================
// JETデータベース表データをCSVテキストファイルへエクスポート
// スキーマの定義がない場合はCSVテキストとして出力される
//
// 出力先のADOCsv1.csv用スキーマファイル(schema.ini)の定義は用意していないの
// で,出力の際作成される.このサンプルのデータでは以下のコードが生成される
// Widthの値は元のデータベースでの定義長
// 文字列は"で括られて(囲まれて)出力される
//
// [ADOCsv1.csv]
// ColNameHeader=True
// CharacterSet=932
// Format=CSVDelimited
// Col1=食品群 Char Width 30
// Col2=番号 Float
// Col3=食品名 Char Width 30
// Col4=キロカロリ Float
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LDataDir : String;
LFileName : String;
LFileFullPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//出力先のフォルダ名とファイル名
LDataDir := '../Data/';
LFileName := 'ADOCsv1.csv';
LFileFullPath := LDataDir + LFileName;
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LFileFullPath) then DeleteFile(LFileFullPath);
//ファイル名の.は#に変換
LFileName := StringReplace(LFileName, '.', '#', [rfReplaceAll]);
//SQL文の作成
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO ' + LFileName + ' IN '
+ AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM 食品カロリ表 ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
03_CSV テキストファイルへのエクスポート ( スキーマ設定あり ) |
JET データベースのデータをカンマ区切りの CSV テキストファイルに出力します.
タイトル行を出力しないようにするために,スキーマファイル内で設定しています. |
|
図5
出力をテキストエディタで表示 |
リスト5
JET データベースのデータを CSV テキストファイルへ出力
Button2Click 以外のコードは上のサンプルと同じ |
//=============================================================================
// JETデータベース表データをCSVテキストファイルへエクスポート2
//
// 出力先のADOCsv2.csv用スキーマファイル(schema.ini)は以下のようにしている
// ColNameHeader=Falseとしているので先頭にタイトル行は出力されない
// 文字列は"で括られて(囲まれて)出力される
//
// [ADOCsv2.csv]
// ColNameHeader=False
// CharacterSet=932
// Format=CSVDelimited
// Col1=番号 Short
// Col2=食品群 Char Width 30
// Col3=食品名 Char Width 30
// Col4=キロカロリ Short
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LDataDir : String;
LFileName : String;
LFileFullPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//出力先のフォルダ名とファイル名
LDataDir := '../Data/';
LFileName := 'ADOCsv2.csv';
LFileFullPath := LDataDir + LFileName;
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LFileFullPath) then DeleteFile(LFileFullPath);
//ファイル名の.は#に変換
LFileName := StringReplace(LFileName, '.', '#', [rfReplaceAll]);
//SQL文の作成
//食品群の野菜類だけをエクスポート
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO ' + LFileName + ' IN '
+ AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM 食品カロリ表 WHERE 食品群="野菜類"';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
JET データベースのデータをタブ区切りのテキストファイルへ出力します.
タブ区切りのテキストデータとして出力するには,スキーマファイルでの設定が必要です.この設定がないと CSV データとして出力することになります. |
|
図6
出力をテキストエディタで表示 |
リスト6
JET データベースのデータをタブ区切りのテキストデータとして出力
Button2Click 以外のコードは上のサンプルと同じ |
//=============================================================================
// JETデータベース表データをタブ区切りテキストファイルへエクスポート
//
// 出力先のADOTab.txt用スキーマファイル(schema.ini)は以下のようにしている
// タブ区切ではWdith指定は無効となるため設定していない
// 文字列は"で括られて(囲まれて)出力される
//
// [ADOTab.txt]
// ColNameHeader=True
// MaxScanRows=0
// Format=TabDelimited
// Col1=番号 Short
// Col2=食品群 Char
// Col3=食品名 Char
// Col4=キロカロリ Short
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LDataDir : String;
LFileName : String;
LFileFullPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//出力先のフォルダ名とファイル名
LDataDir := '../Data/';
LFileName := 'ADOTab.txt';
LFileFullPath := LDataDir + LFileName;
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LFileFullPath) then DeleteFile(LFileFullPath);
//ファイル名の.は#に変換
LFileName := StringReplace(LFileName, '.', '#', [rfReplaceAll]);
//SQL文の作成
//食品群の野菜類だけをエクスポート
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO ' + LFileName + ' IN '
+ AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM 食品カロリ表 ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
JET エンジンデータベースのデータを固定長テキストデータとして出力します.
固定長テキストデータとして出力するには,必ずスキーマファイルで各項目ごとに出力後のデータ長を設定しなければなりません.各データはこの長さで出力されます.スキーマファイル内に設定がない場合は,CSV のテキストデータ形式で出力されてしまいます. |
|
図7
出力をテキストエディタで表示 |
リスト7
JET エンジンデータベースのデータを固定長テキストデータとして出力
Button2Click 以外のコードは上のサンプルと同じ |
//=============================================================================
// JETデータベース表データを固定長テキストファイルへエクスポート
//
// 出力先のADOFix.txt用スキーマファイル(schema.ini)は以下のようにしている
// 各項目の長さはWidthで指定した長さで出力される
//
// [ADOFix.txt]
// ColNameHeader=False
// Format=FixedLength
// Col1=番号 Short Width 6
// Col2=食品群 Char Width 20
// Col3=食品名 Char Width 23
// Col4=キロカロリ Short Width 8
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LDataDir : String;
LFileName : String;
LFileFullPath : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//出力先のフォルダ名とファイル名
LDataDir := '../Data/';
LFileName := 'ADOFix.txt';
LFileFullPath := LDataDir + LFileName;
//既に同名のファイルが存在する場合はエラーとなるので予め削除
if FileExists(LFileFullPath) then DeleteFile(LFileFullPath);
//ファイル名の.は#に変換
LFileName := StringReplace(LFileName, '.', '#', [rfReplaceAll]);
//SQL文の作成
//必要であれば*部分に取得したい項目名を並べる
LstrSelect := 'SELECT * INTO ' + LFileName + ' IN '
+ AnsiQuotedStr(LDataDir, '"') + ' '
+ AnsiQuotedStr('Text;', '"');
LstrFrom := 'FROM 食品カロリ表 ';
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
06_Paradox データベースへのエクスポート |
JET エンジンデータベースのデータを Paradox データベースの表へ出力します.
Paradox データベースの出力先の表に該当項目がない場合は出力できません.
このサンプルコードでは,実際には Paradox の表にインポートする形式になっています. |
|
図8
設計時画面 |
|
図9
実行結果
|
リスト8
JET エンジンデータベースのデータを Paradox データベースへ出力 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ExtCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
DBGrid1: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// FormCreate時に各種初期設定
// ADOConnecton1,ADOQuery1はFormに配置しデフォルトの状態で使用
// それ以外の設定はこのサンプルコード内で行っている
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.Connected := False;
ADOConnection1.KeepConnection := False;
ADOConnection1.LoginPrompt := False;
ADOConnection1.Mode := cmReadWrite;
ADOConnection1.Provider := 'Microsoft.Jet.OLEDB.4.0';
ADOConnection1.ConnectionString := 'Data Source=../Data;'
+ 'Extended Properties="Paradox 5.x;"';
ADOQuery1.Connection := ADOConnection1;
//Windows VisataとWindows 7では接続した後に接続文字列を設定しないと正常動作不可
ADOConnection1.Connected := True;
ADOQuery1.ConnectionString := ADOConnection1.ConnectionString;
end;
//=============================================================================
// フォームを閉じたら接続を切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOConnection1.Connected := False;
end;
//=============================================================================
// 対象となるmdbの該当テーブルのデータを全て削除
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
//Paradoxの該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETE FROM ParaTest ');
ADOQuery1.ExecSQL;
Screen.Cursor := crDefault;
end;
//=============================================================================
// JETデータベースの表をParadoxのデータベースの表へエクスポート
// (Paradoxの表に,JETデータベースの表からデータをインポート)
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LJETDBName : String;
LstrInto : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//テーブルのデータを全て削除
Button1Click(nil);
//JETデータベース名
//このデータベース内の食品カロリ表という表のデータをParadoxに持ってくる
LJETDBName := '../DB_MDB/ForExport.mdb';
//SQL文の作成
LstrInto := 'INSERT INTO ParaTest (番号, 食品群, 食品名, キロカロリ) ';
LstrSelect := 'SELECT 番号, 食品群, 食品名, キロカロリ ';
LstrFrom := 'FROM 食品カロリ表 IN ' + AnsiQuotedStr(LJETDBName, '"');
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(LstrInto);
ADOQuery1.SQL.Add(LstrSelect);
ADOQuery1.SQL.Add(LstrFrom);
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
//=============================================================================
// Paradoxのテーブルを開いてDBGridに表示
// インポートする前は,現在の表のデータが表示される
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
ADOQuery1.DisableControls;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM ParaTest ');
ADOQuery1.Open;
ADOQuery1.EnableControls;
Screen.Cursor := crDefault;
end;
end.
|