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 で JET データベースのデータをエクセルやテキストファイルに出力するサンプルです.
テキストファイルの場合,ADO ではデータの更新 (削除・追加等) ができないため,既にファイルが存在する時はそのファイルを削除しています.クエリの結果をエクスポートしたい場合は,SQL 文で次の様に指定できます.


リスト1
クエリーの結果をエクスポートする場合
  LstrSelect := 'SELECT * INTO ' + LFileName + ' IN '
                                 + AnsiQuotedStr(LDataDir, '"') + ' '
                                 + AnsiQuotedStr('Text;', '"');
  LstrFrom := 'FROM 食品カロリ表 WHERE 食品群 LIKE "%菜%" ';


リスト2
サブクエリも使用可能
  LstrSelect := 'SELECT * INTO ' + LFileName + ' IN '
                                 + AnsiQuotedStr(LDataDir, '"') + ' '
                                 + AnsiQuotedStr('Text;', '"');
  LstrFrom := 'FROM (SELECT * FROM 食品カロリ表 WHERE 食品群 LIKE "%菜%" ) ';


このページのサンプルプログラムでは,下図のような JET データベースのデータをエクスポート先に出力します.また Paradox データベース以外のサンプルは,その下の図のような,全てボタン 1 つだけのプロジェクトとなっています.


図1
エクスポートするデータ
図2
設計時画面
  • Paradox データベースへのエクスポートを除いて全て同じ

以下は,サンプルプログラム集の ADO 関係の記事へのリンクです.





01_エクセル ( シート ) へのエクスポート


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;




04_タブ区切りテキストファイルへのエクスポート


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;




05_固定長テキストファイルへのエクスポート


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
実行結果
  • Paradox データベースのデータを表示

リスト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.