Delphiでお手軽プログラミング

Delphiでお手軽プログラミングメニュー

DelphiでMariaDB(MySQL)と接続するデータベース アプリケーションを作成する


はじめに

このデータベースアプリケーションの作成では、 物品および物品の貸出履歴を管理できるデータベースアプリケーションを作成します。
私はDelphi10.3Community Edition(Delphiの無料版)を使っていて、これはProfessional相当なので、FireDacを使う場合はライセンス上、Localhostデータベースにのみ接続して良いようです。

MySQLやMariaDBとの接続は単方向データセットなのでデータの更新の為にTDatasetProviderが必要になり、一時的にデータを保持するためにTClientDatasetが必要になります。
単方向データセット
TFDConnection ⇔ TFDTable ⇔ TDataSetProviderTClientDataSet ⇔ TDataSource ⇔ TDBGridやTDBNavigator
双方向データセット(ODBC経由でAccess[jet4.0]接続や、MS-SQL Server接続等)
TFDConnection ⇔ TFDTable ⇔ TDataSource ⇔ TDBGridやTDBNavigator



MariaDB(又はMySQL)に接続するDLLファイルをパスの通ったフォルダに入れる

インターネット等から「libmariadb.dll」又は「libmysql.dll」ファイルをダウンロードして
c:\windows
等のパスの通ったフォルダに入れる。
私は、インターネット(https://mariadb.org/download/)からMariaDBサーバーをダウンロードして、MariaDBサーバーをインストールし、
C:\Program Files (x86)\MariaDB 10.4\lib
フォルダ内にある「libmariadb.dll」を使いました。
Delphiで作成するアプリのビット数と、DLLのビット数は合っていなければなりません。


MariaDB(又はMySQL)に物品貸出用データベースとテーブルを作成する

以下SQLにてデータベース「db_management_goods」を作成します。
-- データベース「物品貸出(db_goods_rent)」の作成
Create database db_goods_rent character set utf8;

-- データベース「db_goods_rent」にユーザ「user」、パスワード「password」でユーザー作成と権限を与える
Grant all on db_goods_rent.* to user@localhost identified by 'password' with grant option;
Flush privileges;

-- データベースに「物品(t_goods)テーブル」を作成
Create table db_goods_rent.t_goods(
  goods_id int auto_increment,  -- 物品id
  goods_name varchar(45),       -- 物品名
  primary key(goods_id)
);

-- データベースに「貸出(t_rent)テーブル」を作成
Create table db_goods_rent.t_rent(
  rent_id int auto_increment,                    -- 貸出id
  goods_id int,                                  -- 貸出物品id
  rent_to_name varchar(45),                      -- 貸出先名
  rent_date datetime default CURRENT_TIMESTAMP,  -- 貸出日
  return_date datetime default null,             -- 返却日
  primary key(rent_id)
);
【t_goods】
カラム名備考
goods_idintauto_increment
primary key
goods_namevarchar(45)
【t_rent】
カラム名備考
rent_idintauto_increment
primary key
goods_idint
rent_to_namevarchar(45)
rent_datedatetimedefault CURRENT_TIMESTAMP
return_datedatetimedefault null

Delphiでのアプリケーション開発を行う

(1)Delphiを起動して新規プロジェクトを作成する

[ファイル]⇒[新規作成]⇒[Windows VCL アプリケーション -Delphi]をクリックします。

「すべて保存」ボタンを押してプロジェクトとユニットに名前を付けて同一フォルダに保存します。(ファイル名は任意で同一フォルダに保存する)

(2)フォームにコンポーネントをドラッグ&ドロップする

ツールパレットの「FireDac」カテゴリからTFDConnection、TFDTable×2、をフォームにドラッグ&ドロップし
「Data Access」カテゴリからTDataSetProvider×2、TClientDataSet×2、TDataSource×2をフォームにドラッグ&ドロップし
「Data Control」カテゴリからTDBGrid×2、TDBNavigator×2をフォームにドラッグ&ドロップします。


(3)DB接続文字列を設定する

FDConnection1をクリックして選択状態にし、プロパティ「LoginPrompt」をFalseに設定します。



FDConnection1オブジェクトを右クリックし「接続エディタ」をクリックします。



ドライバIDを「MySQL」に設定します。
Databaseを「db_goods_rent」に設定、 User_Nameを「user」に設定し、Passwordを「password」に設定、 Serverを「localhost」に設定、CharacterSetを「utf8」に設定します。
「テスト」ボタンを押し、ログインダイアログが表示されたら「OK」ボタンを押して接続確認します。
「接続の確立が成功しました。」と表示されれば成功です。

(4)プロパティの設定

FDTable1をクリックして選択し、Connectionプロパティを「FDConnection1」に設定する。
TableNameプロパティを「db_goods_rent.t_goods」に設定します。



FDTable2をクリックして選択し、Connectionプロパティを「FDConnection1」に設定する。
TableNameプロパティを「db_goods_rent.t_rent」に設定します。


DataSetProvider1をクリックして選択し、 DataSetプロパティを「FDTable1」に設定します。
DataSetProvider2をクリックして選択し、 DataSetプロパティを「FDTable2」に設定します。


ClientDataSet1をクリックして選択し、 ProviderNameプロパティを「DataSetProvider1」に設定し、 Activeプロパティを「True」に設定します。
ClientDataSet2をクリックして選択し、 ProviderNameプロパティを「DataSetProvider2」に設定し、 Activeプロパティを「True」に設定し、
MasterSourceプロパティを「DataSource1」に設定し、 IndexFieldNamesプロパティを「doods_id」に設定し、 MasterFieldsプロパティを「goods_id」に設定します。
これにより、ClientDataSet1.doods_id→ClientDataSet2.doods_idで[1対多]の関係(マスタ/詳細関係)が設定されます。


DataSource1をクリックして選択し、 DataSetプロパティを「ClientDataset1」に設定します。
DataSource2をクリックして選択し、 DataSetプロパティを「ClientDataset2」に設定します。


DBGrid1をクリックして選択し、 DataSourceプロパティを「DataSource1」に設定します。
DBGrid2をクリックして選択し、 DataSourceプロパティを「DataSource2」に設定します。


DBNavigator1をクリックして選択し、 DataSourceプロパティを「DataSource1」に設定します。
DBNavigator2をクリックして選択し、 DataSourceプロパティを「DataSource2」に設定します。


(5)ソースコードを記述する

ClientDataSet1のAfterPostイベントと、ClientDataSet2のAfterPostイベントを記述します。
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait,
  FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt,
  Datasnap.DBClient, Datasnap.Provider, Data.DB, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client, Vcl.Grids, Vcl.DBGrids, FireDAC.Phys.MySQL,
  FireDAC.Phys.MySQLDef, Vcl.ExtCtrls, Vcl.DBCtrls;

type
  TForm1 = class(TForm)
    FDConnection1: TFDConnection;
    FDTable1: TFDTable;
    FDTable2: TFDTable;
    DataSetProvider1: TDataSetProvider;
    DataSetProvider2: TDataSetProvider;
    ClientDataSet1: TClientDataSet;
    ClientDataSet2: TClientDataSet;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    DBNavigator1: TDBNavigator;
    DBNavigator2: TDBNavigator;
    procedure ClientDataSet1AfterPost(DataSet: TDataSet);
    procedure ClientDataSet2AfterPost(DataSet: TDataSet);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet);
var Bookmark: TBookmark;
begin
  //クライアントデータセットが更新されたら、MariaDB(MySQL)にも反映させる
  ClientDataSet1.ApplyUpdates(-1);
  bookmark:=ClientDataSet1.GetBookmark;
  ClientDataSet1.Refresh;
  ClientDataSet1.GotoBookmark(Bookmark);
end;

procedure TForm1.ClientDataSet2AfterPost(DataSet: TDataSet);
var Bookmark: TBookmark;
begin
  //クライアントデータセットが更新されたら、MariaDB(MySQL)にも反映させる
  ClientDataSet2.ApplyUpdates(-1);
  bookmark:=ClientDataSet2.GetBookmark;
  ClientDataSet2.Refresh;
  ClientDataSet2.GotoBookmark(Bookmark);
end;

end.


実行ボタンで実行させる

実行ボタン、またはF9ボタンを押して実行させます。

ソースコードを10行ほど記述しましたが、データベースアプリケーションの作成が完了です。
物品および物品の貸出履歴を管理できるデータベースアプリケーションが完成しました。

Copyright 2021 Mam