Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2007年11月01日] [更新 2015年09月30日] Delphi サンプルプログラム集
622_ADO で JET データベースにインポート
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro + Msjet40.dll 4.00.9756.0
622_ADO_mdbInportt.zip [5,078 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 関係の記事へのリンクです.





01_エクセル ( シート ) データからインポート


エクセルの指定シートのデータを JET データベースの表に取込む (インポートする )例です.
このサンプルのコードでは Excel 2007 で作成したエクセルのブックは扱えません.


図1
設計時画面
図2
取込むエクセルのデータ
図3
実行結果
  • 取込んだデータを表示

リスト1
エクセルから 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;
    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=../DB_MDB/TestMDB.mdb;';

  ADOQuery1.Connection := ADOConnection1;
end;

//=============================================================================
//  フォームを閉じたら接続を切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOConnection1.Connected := False;
end;

//=============================================================================
//  対象となるmdbの該当テーブルのデータを全て削除
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;

  //mdbの該当テーブルのデータを全て削除
  //テーブル(表)を削除するわけではない
  //mdbの該当テーブルのデータを全て削除
  //テーブル(表)を削除するわけではない
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('DELETE FROM TestTbl ');
  ADOQuery1.ExecSQL;

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  Excel(シート)からJET DBの表にインポート
//
//  エクセルのシートのデータを,JETデータベースの表に新規追加していく
//  データベースの表には追加する項目があらかじめ用意されていなければならない
//  表のデータを全て削除して行っているのは重複データを避けるため
//
//  新規に表を作成してデータを追加するには以下を参考にして表を作成する
//  [630_mdbデータベース新規作成と最適化]
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LExcelPath : String;
  LstrInto   : String;
  LstrSelect : String;
  LstrFrom   : String;
begin
  Screen.Cursor := crHourGlass;

  //テーブルのデータを全て削除
  Button1Click(nil);

  //対象のExcelのブック
  LExcelPath := '../Data/ADOTest.xls';

  //SQL文の作成
  LstrInto   := 'INSERT INTO TestTbl (整理番号, 店舗名, 住所, 請求日) ';
  LstrSelect := 'SELECT [Sheet1$].CustNo,'
             + '        [Sheet1$].Company,'
             + '        [Sheet1$].Addr1,'
             + '        [Sheet1$].LastInvoiceDate ';
  LstrFrom   := 'FROM [Sheet1$] IN ' + AnsiQuotedStr(LExcelPath, '"') + ' '
                                     + AnsiQuotedStr('Excel 8.0;', '"');
  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;

//=============================================================================
//  JETデータベースのテーブルを開いてTDBGridに表示
//  インポートする前は,現在の表のデータが表示される
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  ADOQuery1.DisableControls;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM TestTbl');
  ADOQuery1.Open;

  ADOQuery1.EnableControls;
  Screen.Cursor := crDefault;
end;

end.




02_CSV テキストファイルからインポート ( スキーマ設定なし )


カンマ区切りの CSV ファイルからJETデータベースにデータを取込む例です.
スキーマの設定を使用しないで,CSV ファイルの先頭行がタイトル行の場合です.


図4
取込む CSV テキスト
  • 1 行目はタイトル行

リスト2
CSV ファイルから JET データベースにデータを取込む
Button2Click 以外のコードは前のサンプルと同じ
//=============================================================================
//  CSV(カンマ区切り)ファイルからJET DBの表にインポート
//
//  CSVテキストファイルのデータを,JETデータベースの表に新規追加していく
//  データベースの表には追加する項目があらかじめ用意されていなければならない
//  表のデータを全て削除して行っているのは重複データを避けるため
//
//  schema.iniは使用してないので,最初の行が項目名となる
//  1行目がタイトル行でないCSVファイルの場合は,スキーマファイルを用意して
//  ColNameHeader=Falseを記述する
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LDataDir   : String;
  LstrInto   : String;
  LstrSelect : String;
  LstrFrom   : String;
begin
  Screen.Cursor := crHourGlass;

  //テーブルのデータを全て削除
  Button1Click(nil);

  //対象のファイルがあるフォルダ名(テキストファイルの場合はこれがデータベース名)
  //実際にインポートするのはADOCsv1.csv
  LDataDir := '../Data';

  //SQL文の作成
  //テキストファイル名(表名)の.は#に置換える
  LstrInto   := 'INSERT INTO TestTbl (整理番号, 店舗名, 住所, 請求日) ';
  LstrSelect := 'SELECT [ADOCsv1#csv].CustNo,'
              + '       [ADOCsv1#csv].Company,'
              + '       [ADOCsv1#csv].Addr1,'
              + '       [ADOCsv1#csv].LastInvoiceDate ';
  LstrFrom   := 'FROM ADOCsv1#csv IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
                                       + AnsiQuotedStr('Text;', '"');
  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;




03_CSV テキストファイルからインポート ( スキーマ設定あり )


カンマ区切りの CSVテ キストデータから JET データベースにデータを取込む例です.
CSV の先頭行からデータとなっているため,スキーマファイルでその設定をしています.


図5
取込むCSVデータ
  • 1 行目からデータの場合
  • 結果は前のサンプルと同じ

リスト3
CSV テキストデータを JET データベースに取込む
Button2Click 以外のコードは前のサンプルと同じ
//=============================================================================
//  CSV(カンマ区切り)ファイルからJET DBの表にインポート
//
//  CSVテキストファイルのデータを,JETデータベースの表に新規追加していく
//  データベースの表には追加する項目があらかじめ用意されていなければならない
//  表のデータを全て削除して行っているのは重複データを避けるため
//
//  以下のスキーマの定義を使用
//  インポートの場合Widthや表示形式の指定は無効.取込み先の表の設定による
//  ただし,固定長テキストの場合は指定しなければならない
//
//  [ADOCsv2.csv]
//  ColNameHeader=False
//  MaxScanRows=0
//  Format=CsvDelimited
//  Col1=AAA Integer
//  Col2=BBB Char
//  Col3=CCC Char
//  Col4=DDD DateTime
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LDataDir   : String;
  LstrInto   : String;
  LstrSelect : String;
  LstrFrom   : String;
begin
  Screen.Cursor := crHourGlass;

  //テーブルのデータを全て削除
  Button1Click(nil);

  //対象のファイルがあるフォルダ名(テキストファイルの場合はこれがデータベース名)
  //実際にインポートするのはADOCsv2.csv
  LDataDir := '../Data';

  //SQL文の作成
  //テキストファイル名(表名)の.は#に置換える
  LstrInto   := 'INSERT INTO TestTbl (整理番号, 店舗名, 住所, 請求日) ';
  LstrSelect := 'SELECT [ADOCsv2#csv].AAA,'
              + '       [ADOCsv2#csv].BBB,'
              + '       [ADOCsv2#csv].CCC,'
              + '       [ADOCsv2#csv].DDD ';
  LstrFrom   := 'FROM ADOCsv2#csv IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
                                       + AnsiQuotedStr('Text;', '"');
  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;




04_タブ区切りテキストファイルからインポート


タブ区切りのテキストデータを JET データベースに取込む例です.
タブ区切りのテキストデータを取込む場合はスキーマファイルでの設定が必要です.


図6
取込むタブ区切りデータ
  • 結果は前のサンプルと同じ

リスト4
タブ区切りのテキストデータを JET データベースに取込む
Button2Click 以外のコード上のサンプルと同じ
//=============================================================================
//  TAB(タブ区切り)ファイルからJET DBの表にインポート
//
//  タブ区切りテキストデータを,JETデータベースの表に新規追加していく
//  データベースの表には追加する項目があらかじめ用意されていなければならない
//  表のデータを全て削除して行っているのは重複データを避けるため
//
//  schema.iniを使用
//  タブ区切りテキストファイルはschema.iniに定義がないとインポートできない
//  ここで使用するschema.iniの設定は以下のようになっている
//  インポートの場合Widthや表示形式の指定は無効.取込み先の表の設定による
//  ただし,固定長テキストの場合は指定しなければならない
//
//  [ADOTab.txt]
//  ColNameHeader=True
//  MaxScanRows=0
//  Format=TabDelimited
//  Col1=整理番号 Integer
//  Col2=店舗名 Char
//  Col3=住所 Char
//  Col4=請求日 DateTime
//
//  新規に表を作成してデータを追加するには以下を参考にして表を作成する
//  [630_mdbデータベース新規作成と最適化]
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LDataDir   : String;
  LstrInto   : String;
  LstrSelect : String;
  LstrFrom   : String;
begin
  Screen.Cursor := crHourGlass;

  //テーブルのデータを全て削除
  Button1Click(nil);

  //対象のファイルがあるフォルダ名(テキストファイルの場合はこれがデータベース名)
  //実際にインポートするのはADOTab.txt
  LDataDir := '../Data';

  //SQL文の作成
  //テキストファイル名(表名)の.は#に置換える
  LstrInto   := 'INSERT INTO TestTbl (整理番号, 店舗名, 住所, 請求日) ';
  LstrSelect := 'SELECT [ADOTab#txt].整理番号,'
              + '       [ADOTab#txt].店舗名,'
              + '       [ADOTab#txt].住所,'
              + '       [ADOTab#txt].請求日 ';
  LstrFrom   := 'FROM ADOTab#txt IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
                                      + AnsiQuotedStr('Text;', '"');
  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;




05_固定長テキストファイルからインポート


固定長テキストデータを JET データベースに取込む例です.固定長テキストデータの場合,必ずスキーマファイルで各項目ごとのデータ長を設定しなければなりません.


図7
取込む固定長データ
  • 結果は上のサンプルと同じ


リスト5
固定長テキストデータを JET データベースに取込む
Button2Click 以外のコードは前のサンプルと同じ
//=============================================================================
//  固定長テキストファイルからJET DBの表にインポート
//
//  固定長テキストのデータを,JETデータベースの表に新規追加していく
//  データベースの表には追加する項目があらかじめ用意されていなければならない
//  表のデータを全て削除して行っているのは重複データを避けるため
//
//  schema.iniを使用した例
//  インポートの場合Widthや表示形式の指定は無効.取込み先の表の設定による
//  ただし,固定長テキストの場合は指定しなければならない
//
//  [ADOFix.txt]
//  ColNameHeader=False
//  Format=FixedLength
//  Col1=整理番号 Integer Width 6
//  Col2=請求日 DateTime width 20
//  Col3=店舗名 Char Width 30
//  Col4=住所 Char Width 25
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LDataDir   : String;
  LstrInto   : String;
  LstrSelect : String;
  LstrFrom   : String;
begin
  Screen.Cursor := crHourGlass;

  //テーブルのデータを全て削除
  Button1Click(nil);

  //対象のファイルがあるフォルダ名(テキストファイルの場合はこれがデータベース名)
  //実際にインポートするのはADOFix.txt
  LDataDir :='../Data';

  //SQL文の作成
  //テキストファイル名(表名)の.は#に置換える
  LstrInto   := 'INSERT into TestTbl (整理番号, 店舗名, 住所, 請求日) ';
  LstrSelect := 'SELECT [ADOFix#txt].整理番号,'
              + '       [ADOFix#txt].店舗名,'
              + '       [ADOFix#txt].住所,'
              + '       [ADOFix#txt].請求日 ';
  LstrFrom   := 'FROM ADOFix#txt IN ' + AnsiQuotedStr(LDataDir, '"') + ' '
                                      + AnsiQuotedStr('Text;', '"');
  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;




06_Paradox データベースからインポート


Paradox データベースの表のデータを JET データベースに取込む例です.
筆者の Windows 7 U64 + Delphi 2010 の環境では,IDE からコンパイルして実行するとエラーとなってしまいましたが,EXE 単独で起動した場合は正常動作しました.


リスト6
Paradox から JET データベースにデータを取込む
Button2Click 以外のコードは前のサンプルと同じ
//=============================================================================
//  ParadoxのデータからJET DBの表にインポート
//
//  Paradoxのデータを,JETデータベースの表に新規追加していく
//  データベースの表には追加する項目があらかじめ用意されていなければならない
//  表のデータを全て削除して行っているのは重複データを避けるため
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LParadoxDir : String;
  LstrInto    : String;
  LstrSelect  : String;
  LstrFrom    : String;
begin
  Screen.Cursor := crHourGlass;

  //テーブルのデータを全て削除
  Button1Click(nil);

  //対象のParadoxのデータベース名(Paradoxはフォルダがデータベース名)
  //対象の表名はTestPdx
  LParadoxDir := '../Data';

  //SQL文の作成
  LstrInto   := 'INSERT INTO TestTbl (整理番号, 店舗名, 住所, 請求日) ';
  LstrSelect := 'SELECT 整理番号, 店舗名, 住所, 請求日 ';
  LstrFrom   := 'FROM TestPdx IN ' + AnsiQuotedStr(LParadoxDir, '"') + ' '
                                   + AnsiQuotedStr('Paradox 5.x;', '"');
  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;