|
Delphi Programming / Object Pascal
[掲載 2005年05月14日] [更新 2013年03月25日] Delphi サンプルプログラム集 |
610_ADO で Paradox にインポート |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE Pro + Excel 2007 |
|
610_ADO_Inportt.zip [5,072 KB] 2013年03月25日版 (EXE 同梱) |
- 2010年05月27日
- インポート元のデータの種類ごとのプロジェクトに分けた
- Windows 7 U64 + Delphi 2010(UP5) Proで動作確認環境変更
- 2013年03月25日
- 各項目の説明を詳しくした
- Windows 7 U64(SP1) + Delphi XE Proで動作確認
|
ADO で Paradox データベースに,エクセルまたは各種テキストファイルのデータを取込む方法の参考用のサンプルプログラムです.
実務上で Paradox のデータベースにインポートすることはあまり考えられませんが,その手法は何かの参考になるかも知れません. |
|
図1
インポート用 Paradox テーブル
- [データベースデスクトップ] を 管理者権限で起動して作成
- ここへ,エクセルまたはテキストファイル等からデータを取込む
|
以下は,サンプルプログラム集の ADO 関係の記事へのリンクです. |
01_エクセル ( シート ) データからインポート |
添付の エクセルの指定シートのデータを Paradox の表に取込む (インポートする) 例です.
このサンプルのコードでは Excel 2007 で作成したエクセルのブックは扱えません. |
|
図2
取込むエクセルのデータ
|
設計時の画面と実行結果です.
これ以降のサンプルも,設計時画面は全く同じです.項目ごとに実行画面を掲載はしていますが,実行結果も同じです. |
|
図3
設計時画面 |
|
図4
実行結果
- [インポート] クリック
- [確認表示] で取込んだデータを表示
|
リスト1
エクセルから 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=../DB_Pdx;'
+ '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;
//=============================================================================
// [表の全データ削除]ボタン
// 対象となるParadoxの該当テーブルのデータを全て削除
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
//mdbの該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETE FROM TestPdx ');
ADOQuery1.ExecSQL;
Screen.Cursor := crDefault;
end;
//=============================================================================
// [インポート]ボタン
// Excel(シート)からParadoxのデータベースの表にインポート
//
// ADOTest.xlsのSheet1の指定項目を,Paradoxの表に新規追加
// Paradoxの表には追加する項目があらかじめ用意されていなければならない
// 表のデータを全て削除して行っているのは重複データを避けるため
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LExcelPath : String;
LstrInto : String;
LstrSelect : String;
LstrFrom : String;
begin
//該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
Button1Click(nil);
Screen.Cursor := crHourGlass;
//対象のExcelのブック
//xlsx形式のブックのトートは扱えないので注意
LExcelPath := '../Data/ADOTest.Xls';
//SQL文の作成
LstrInto := 'INSERT INTO TestPdx (番号, 食品群, 食品名, キロカロリ) ';
LstrSelect := 'SELECT [Sheet1$].番号,'
+ ' [Sheet1$].食品群,'
+ ' [Sheet1$].食品名,'
+ ' [Sheet1$].キロカロリ ';
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;
//=============================================================================
// [確認表示]ボタン
// Paradoxのテーブルを開いてDBGridに表示
// インポートする前は,現在の表のデータが表示される
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
ADOQuery1.DisableControls;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM TestPdx ');
ADOQuery1.Open;
ADOQuery1.EnableControls;
Screen.Cursor := crDefault;
end;
end.
02_CSV テキストファイルからインポート ( スキーマ設定なし ) |
添付の,以下のカンマ区切りの CSV ファイルを Paradox にデータを取込む例です.
このサンプルでは,スキーマの設定を使用しません.スキーマの設定を使用しない場合,CSV ファイルの先頭行はタイトル行と解釈され,データとしてはインポートしません. |
"番号","食品群","食品名","キロカロリ"
1,"穀類","薄力粉",368
2,"穀類","中華麺",284
3,"穀類","マカロニ",378
4,"穀類","パン粉",372
5,"でん粉類","ジャガイモ",77
6,"でん粉類","マッシュポテト",357
7,"でん粉類","片栗粉",330
8,"でん粉類","砂糖",384
9,"砂糖類","植物油",921
10,"油脂類","豚肉ロース",258
11,"獣鳥鯨肉類","豚肉ばら",417
12,"獣鳥鯨肉類","プレススハム",123
13,"獣鳥鯨肉類","卵黄",363
14,"卵類","牛乳",59
15,"乳類","粉チーズ",475
16,"乳類","バター",745
17,"乳類","しょうが",31
18,"野菜類","たけのこ",34
19,"野菜類","たまねぎ",35
20,"野菜類","にんじん",32
21,"野菜類","ねぎ",25
22,"野菜類","パセリ",37
23,"野菜類","もやし",54
24,"果実類","りんご",50
25,"果実類","レモン汁",24
26,"きのこ類","しいたけ",0
27,"きのこ類","マッシュルーム",0
28,"飲料類","ぶどう酒",75
29,"調味料類","塩",58
30,"調味料類","しょうゆ",48
31,"調味料類","食酢",16
32,"調味料類","こしょう",0
33,"調味料類","シナモン",0
|
|
図5
実行結果
- [インポート] クリック
- [確認表示] で取込んだデータを表示
|
リスト2
CSV ファイルから Paradox にデータを取込む
Button2Click 以外のコードは上のサンプルと同じ |
//=============================================================================
// [インポート]ボタン
// CSVテキストファイルからParadoxのデータベースの表にインポート
//
// ADOCsv1.csvのテキストデータを,Paradoxの表に新規追加していく
// Paradoxの表には追加する項目があらかじめ用意されていなければならない
// 表のデータを全て削除して行っているのは重複データを避けるため
//
// ADOCsv1.csvにはスキーマの定義を用意していないので,1行目はタイトル行と解釈
// されるため,取込まない
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LDataDir : String;
LstrInto : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
Button1Click(nil);
//対象のCSVファイルがあるフォルダ
//テキストデータはフォルダがデータベース扱い
LDataDir := '../Data';
//SQL文の作成
//テキストファイル名(表名)の.は#に置換える
LstrInto := 'INSERT INTO TestPdx (番号, 食品群, 食品名, キロカロリ) ';
LstrSelect := 'SELECT [ADOCsv1#csv].番号,'
+ ' [ADOCsv1#csv].食品群,'
+ ' [ADOCsv1#csv].食品名,'
+ ' [ADOCsv1#csv].キロカロリ ';
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 テキストデータから Paradox にデータを取込む例です.
第 1 行目からデータとなっていて,項目名の行がない CSV ファイルの場合です.スキーマの設定がないと,第 1 行目がタイトルとなってしまいます. |
1,"穀類","薄力粉",368
2,"穀類","中華麺",284
3,"穀類","マカロニ",378
4,"穀類","パン粉",372
5,"でん粉類","ジャガイモ",77
6,"でん粉類","マッシュポテト",357
7,"でん粉類","片栗粉",330
8,"でん粉類","砂糖",384
9,"砂糖類","植物油",921
10,"油脂類","豚肉ロース",258
11,"獣鳥鯨肉類","豚肉ばら",417
12,"獣鳥鯨肉類","プレススハム",123
13,"獣鳥鯨肉類","卵黄",363
14,"卵類","牛乳",59
15,"乳類","粉チーズ",475
16,"乳類","バター",745
17,"乳類","しょうが",31
18,"野菜類","たけのこ",34
19,"野菜類","たまねぎ",35
20,"野菜類","にんじん",32
21,"野菜類","ねぎ",25
22,"野菜類","パセリ",37
23,"野菜類","もやし",54
24,"果実類","りんご",50
25,"果実類","レモン汁",24
26,"きのこ類","しいたけ",0
27,"きのこ類","マッシュルーム",0
28,"飲料類","ぶどう酒",75
29,"調味料類","塩",58
30,"調味料類","しょうゆ",48
31,"調味料類","食酢",16
32,"調味料類","こしょう",0
33,"調味料類","シナモン",0
|
添付のスキーマファイル,schema.ini 内のスキーマの設定です.[] 内が Paradox にインポート,つまり取り込むデータのファイル名です.
ColNameHeader=False は第 1 行目は項目名ではない,つまり 1 行目から実際のデータであることを意味しています.項目名は使用しませんが項目の設定は必要です.項目名は適当に付けています. |
[ADOCsv2.csv]
ColNameHeader=False
CharacterSet=932
MaxScanRows=0
Format=CsvDelimited
Col1=AAA Integer
Col2=BBB Char
Col3=CCC Char
Col4=DDD Integer
|
|
図6
実行結果
- [インポート] クリック
- [確認表示] で取込んだデータを表示
|
リスト3
CSV テキストデータを Paradox に取込む
Button2Click 以外のコードは前のサンプルと同じ |
//=============================================================================
// [インポート]ボタン
// CSVテキストファイルからParadoxのデータベースの表にインポート
// CSVの第1行目からデータの場合
//
// ADOCsv2.csvのテキストデータを,Paradoxの表に新規追加していく
// Paradoxの表には追加する項目があらかじめ用意されていなければならない
// 表のデータを全て削除して行っているのは重複データを避けるため
//
// スキーマファイル(schema.ini)の定義は,
// インポートの場合Widthや表示形式の指定は無効.取込む側の表の設定による
// ただし,固定長テキストの場合は必要
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LDataDir : String;
LstrInto : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
Button1Click(nil);
//対象のCSVファイルがあるフォルダ
//テキストデータはフォルダがデータベース扱い
LDataDir := '../Data';
LDataDir := ExtractFilePath(ExtractFileDir(Application.ExeName)) + 'Data';// '../Data';
//SQL文の作成
//テキストファイル名(表名)の.は#に置換える
LstrInto := 'INSERT INTO TestPdx (番号, 食品群, 食品名, キロカロリ) ';
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;
添付の,次のタブ区切りのテキストデータを Paradox に取込む例です.
タブ区切りのテキストデータを取込む場合はスキーマファイルでの設定が必ず必要です. |
"番号" "食品群" "食品名" "キロカロリ"
1 "穀類" "薄力粉" 368
2 "穀類" "中華麺" 284
3 "穀類" "マカロニ" 378
4 "穀類" "パン粉" 372
5 "でん粉類" "ジャガイモ" 77
6 "でん粉類" "マッシュポテト" 357
7 "でん粉類" "片栗粉" 330
8 "でん粉類" "砂糖" 384
9 "砂糖類" "植物油" 921
10 "油脂類" "豚肉ロース" 258
11 "獣鳥鯨肉類" "豚肉ばら" 417
12 "獣鳥鯨肉類" "プレススハム" 123
13 "獣鳥鯨肉類" "卵黄" 363
14 "卵類" "牛乳" 59
15 "乳類" "粉チーズ" 475
16 "乳類" "バター" 745
17 "乳類" "しょうが" 31
18 "野菜類" "たけのこ" 34
19 "野菜類" "たまねぎ" 35
20 "野菜類" "にんじん" 32
21 "野菜類" "ねぎ" 25
22 "野菜類" "パセリ" 37
23 "野菜類" "もやし" 54
24 "果実類" "りんご" 50
25 "果実類" "レモン汁" 24
26 "きのこ類" "しいたけ" 0
27 "きのこ類" "マッシュルーム" 0
28 "飲料類" "ぶどう酒" 75
29 "調味料類" "塩" 58
30 "調味料類" "しょうゆ" 48
31 "調味料類" "食酢" 16
32 "調味料類" "こしょう" 0
33 "調味料類" "シナモン" 0
|
添付のスキーマファイル,schema.ini 内のスキーマの設定です.[] 内が Paradox にインポート,つまり取り込むデータのファイル名です.
ColNameHeader=True が第 1 行目が項目名であることを意味しています. |
[ADOTab.txt]
ColNameHeader=True
MaxScanRows=0
Format=TabDelimited
Col1=食品番号 Integer
Col2=食品群 Char Width 20
Col3=食品名 Char Width 20
Col4=キロカロリ Integer
|
|
図7
実行結果
- [インポート] クリック
- [確認表示] で取込んだデータを表示
|
リスト4
タブ区切りのテキストデータを Paradox に取込む
Button2Click 以外のコードは前のサンプルと同じ |
//=============================================================================
// [インポート]ボタン
// タブ区切りテキストファイルからParadoxのデータベースの表にインポート
//
// ADOTab.txtのテキストデータを,Paradoxの表に新規追加していく
// Paradoxの表には追加する項目があらかじめ用意されていなければならない
// 表のデータを全て削除して行っているのは重複データを避けるため
//
// スキーマファイル(schema.ini)の定義は,
// インポートの場合Widthや表示形式の指定は無効.取込む側の表の設定による
// ただし,固定長テキストの場合は必要
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LDataDir : String;
LstrInto : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
Button1Click(nil);
//対象のテキストファイルがあるフォルダ
//テキストデータはフォルダがデータベース扱い
LDataDir := '../Data';
//SQL文の作成
//テキストファイル名(表名)の.は#に置換える
LstrInto := 'INSERT INTO TestPdx (番号, 食品群, 食品名, キロカロリ) ';
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;
添付の,以下の固定長テキストデータを Paradox に取込む例です.
固定長テキストデータを取込む場合はスキーマファイルでの設定が必ず必要です. |
1 穀類 薄力粉 368
2 穀類 中華麺 284
3 穀類 マカロニ 378
4 穀類 パン粉 372
5 でん粉類 ジャガイモ 77
6 でん粉類 マッシュポテト 357
7 でん粉類 片栗粉 330
8 でん粉類 砂糖 384
9 砂糖類 植物油 921
10 油脂類 豚肉ロース 258
11 獣鳥鯨肉類 豚肉ばら 417
12 獣鳥鯨肉類 プレススハム 123
13 獣鳥鯨肉類 卵黄 363
14 卵類 牛乳 59
15 乳類 粉チーズ 475
16 乳類 バター 745
17 乳類 しょうが 31
18 野菜類 たけのこ 34
19 野菜類 たまねぎ 35
20 野菜類 にんじん 32
21 野菜類 ねぎ 25
22 野菜類 パセリ 37
23 野菜類 もやし 54
24 果実類 りんご 50
25 果実類 レモン汁 24
26 きのこ類 しいたけ 0
27 きのこ類 マッシュルーム 0
28 飲料類 ぶどう酒 75
29 調味料類 塩 58
30 調味料類 しょうゆ 48
31 調味料類 食酢 16
32 調味料類 こしょう 0
33 調味料類 シナモン 0
|
添付のスキーマファイル,schema.ini 内のスキーマの設定です.[] 内が Paradox にインポート,つまり取り込むデータのファイル名です.
ColNameHeader=False は第 1 行目は項目名ではない,つまり 1 行目から実際のデータであることを意味しています.
固定長テキストデータの場合は,スキーマの各項目の Width の値の設定が必要です.値は,実際の各項目の長さ以内として,合計値が固定長データの 1 行の長さを超えないようにします. |
[ADOFix.txt]
ColNameHeader=False
Format=FixedLength
Col1=食品番号 Integer Width 6
Col2=食品群 Char Width 20
Col3=食品名 Char Width 20
Col4=キロカロリ Integer Width 6
|
|
図8
実行結果
- [インポート] クリック
- [確認表示] で取込んだデータを表示
|
リスト5
固定長テキストデータを Paradox に取込む
Button2Click 以外のコードは前のサンプルと同じ |
//=============================================================================
// [インポート]ボタン
// 固定長テキストファイルからParadoxのデータベースの表にインポート
//
// ADOFix.txtのテキストデータを,Paradoxの表に新規追加していく
// Paradoxの表には追加する項目があらかじめ用意されていなければならない
// 表のデータを全て削除して行っているのは重複データを避けるため
//
// スキーマファイル(schema.ini)の定義は,
// インポートの場合Widthや表示形式の指定は無効.取込む側の表の設定による
// ただし,固定長テキストの場合は必要
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LDataDir : String;
LstrInto : String;
LstrSelect : String;
LstrFrom : String;
begin
Screen.Cursor := crHourGlass;
//該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
Button1Click(nil);
//対象のテキストファイルがあるフォルダ
//テキストデータはフォルダがデータベース扱い
LDataDir := '../Data';
//SQL文の作成
//テキストファイル名(表名)の.は#に置換える
LstrInto := 'INSERT INTO TestPdx (番号, 食品群, 食品名, キロカロリ) ';
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;
添付している,JET データベース内の表データを Paradox に取込む例です. |
|
図9
実行結果
- [インポート] クリック
- [確認表示] で取込んだデータを表示
|
リスト6
JET エンジンデータベースから Paradox にデータを取込む
Button2Click 以外のコードは前のサンプルと同じ |
//=============================================================================
// [インポート]ボタン
// Paradoxの表に,JETデータベースの表からデータをインポート
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LJETDBName : String;
LSQLText : string;
begin
Screen.Cursor := crHourGlass;
//Paradoxの該当テーブルのデータを全て削除
//テーブル(表)を削除するわけではない
Button1Click(nil);
//JETデータベース名
//このデータベース内の食品カロリ表という表から取り出す
LJETDBName := '../Data/TestMDB.mdb';
//SQL文の作成
LSQLText := 'INSERT INTO TestPdx (番号, 食品群, 食品名, キロカロリ) '
+ 'SELECT 番号, 食品群, 食品名, キロカロリ '
+ 'FROM 食品カロリ表 IN ' + AnsiQuotedStr(LJETDBName, '"');
try
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := LSQLText;
ADOQuery1.ExecSQL;
except
raise;
end;
Screen.Cursor := crDefault;
end;
|