LazarusからMariaDBへ接続する
この記事は、前回のものから書き直している。Lazarusが2.2.0にバージョンアップし、MySQL8.0に対応したコンポーネントが追加された。だが、コンポーネントをアクティブやノンアクティブに変更するとアクセス違反というエラーが表示されるものの、SQLQueryというコンポーネントをクリックして選択すると、なにも表示されないポップアップウィンドウが表示されるといったことは解消されている。また、接続するためにライブラリlibmysqlclient20.soをインストールする必要があったが不要になった。
さて、あくまで接続テストである。コンパイルして問題なく実行できることを確認している。テスト環境はLinux mint 20.3 MATE、Lazarus 2.2.0、MariaDB 10.7.3である。記事内容を実行して確認するには、MariaDBが予め実行していること。データベースbooksdbがあり、テーブルtbooksにデータが入力されていることが前提である。また、Lazarusの操作を覚えておくことは必須である。
データベースの作成とテーブルに入力するデータについては、前回の記事であるDBeaver-CEの入門記事を読んで頂ければよい。
フォームの作成
フォームに配置するコンポーネントは5つ。MySQL80Connention1、SQLQuery1、SQLTransaction1、DataSource1、DBGrid1である。そのほかに、プログラミングテストとして、TLabel、TEdit、TButtonを配置した。TEditに入力したSQL文を実行して結果を見るためである。
それぞれのプロパティ設定は次のとおり。ただし、Visual Studio CommunityやDelphi Community Editionを使う場合はコンポーネントの名称やプロパティ名も異なる。
MySQL80Connecntion1
プロパティ | 設定値 |
CharSet | UTF8 |
DataBaseName | booksdb |
HostName | localhost |
Password | 設定したパスワードを入力する |
Port | 3306 |
Transaction | SQLTransaction1 |
UserName | root |
SQLQuery1
プロパティ | 設定値 |
DataBase | MySQL80Connection1 |
Transaction | SQLTransaction1 |
SQL | SELECT * FROM tbooks; |
SQLTransaction1
プロパティ | 設定値 |
DataBase | MySQL80Connecntion1 |
DataSource1
プロパティ | 設定値 |
DataSet | SQLQuery1 |
DBGrid1
プロパティColumnsでフィールドを追加し、各フィールドのプロパティWidthを適当な値に設定している。また、publish_dateのプロパティDisplay FormatをYYYY-MM-DDに設定しておく。設定しないとDD-MM-YY形式になる。
接続確認と実行
以上の設定が終わったら、MySQL80Connection1のConnectedをTrueに、SQLQuery1とSQLTransaction1のActiveをTrueにする。この操作でアクセス違反のエラーが表示され、アクティブにならないことがある。アクティブになれば接続はできている。
接続できると、実行しなくともグリッドにテーブルに登録しているデータが表示される。
コンパイルして実行した結果は下図のとおりである。コンポーネントは表示されない。
簡単なデータベースプログラミング
TEditに入力したSQL文を実行して結果を表示する簡単なプログラムを作成してみる。まずSQLQuery1のプロパティActiveをFalseにしてコンパイル・実行する。以下のように、DBGridには何も表示されない。
SQL入力欄にSQL文を入力して[実行]をクリックしてみよう。
簡易プログラムのためエラーチェックはtry〜exceptで行っているだけである。今回はDBGridを使用したがGridを使用する場合は実行結果の表示方法が異なる。main.pasの内容を以下に掲げる。太字部分が実際にコーディングする部分である。
main.pas
unit main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DB, SQLDB, SQLite3Conn, odbcconn,
Forms, Controls, Graphics, Dialogs, DBGrids, StdCtrls, mysql80conn;
type
{ TForm1 }
TForm1 = class(TForm)
ExecButton: TButton;
ClearButton: TButton;
CloseButton: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Edit1: TEdit;
Label1: TLabel;
MySQL80Connection1: TMySQL80Connection;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
procedure ExecButtonClick(Sender: TObject);
procedure ClearButtonClick(Sender: TObject);
procedure CloseButtonClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.ExecButtonClick(Sender: TObject);
var
S: String;
Result: Boolean;
begin
// SQL入力欄が空白かどうかチェック
S := Edit1.Text;
Result := S.IsEmpty;
try
// 空っぽなら何もしない
if not Result then
begin
// 設定されているSQLをクリアして入力したSQLをセット
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Text := Edit1.Text;
// クエリーをアクティブにする
MySQL80Connection1.Connected := true;
SQLQuery1.Active := true;
end;
except
on E: Exception do
ShowMessage(E.message);
end;
end;
procedure TForm1.ClearButtonClick(Sender: TObject);
begin
Edit1.Clear;
SQLQuery1.Active := false;
end;
procedure TForm1.CloseButtonClick(Sender: TObject);
begin
if MySQL80Connection1.Connected = true then
begin
MySQL80Connection1.Close;
end;
MySQL80Connection1.Free;
Close;
end;
end.
今回テストしてみたが、コード化においてやや不安を残す結果となる。開発段階において、SQLdbパネルのコンポーネントは最後にフォームに設定しないと、Captionに1文字入力するたびにアクセス違反が表示される。また、データベースプログラミングについては、Delphiの書籍でもう少し学習する必要がありそうだ。