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

プロパティ設定値
CharSetUTF8
DataBaseNamebooksdb
HostNamelocalhost
Password設定したパスワードを入力する
Port3306
TransactionSQLTransaction1
UserNameroot
表.1 MySQL80Connector1のプロパティ値

SQLQuery1

プロパティ設定値
DataBaseMySQL80Connection1
TransactionSQLTransaction1
SQLSELECT * FROM tbooks;
表.2 SQLQuery1のプロパティ値

SQLTransaction1

プロパティ設定値
DataBaseMySQL80Connecntion1
表.3 SQLTransaction1のプロパティ値

DataSource1

プロパティ設定値
DataSetSQLQuery1
表.4 DataSource1のプロパティ値

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文を入力して[実行]をクリックしてみよう。

book_idが2から4までのデータを表示
book_idが2から4までのデータを表示

簡易プログラムのためエラーチェックは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の書籍でもう少し学習する必要がありそうだ。