2025/12/17

Object Pascal SQLdb

Object Pascal 的自由軟體實作 Free Pascal 可以使用 SQLdb 套件存取 RDBMS(支援的資料庫包含 Oracle, MSSQL, MySQL, PostgreSQL, Firebird, SQLite 等, 以及通用的介面 ODBC) 。

下面連線到 PostgreSQL 取得版本資訊的程式:

{$ifdef FPC} {$mode delphi} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}

program MyProgram;

uses 
SysUtils, SQLdb, PQConnection;


var 
  Conn: TSQLConnection;
  Transaction1: TSQLTransaction;
  Query1: TSQLQuery;

begin
  Conn := TPQConnection.Create(nil);
  try
    try
      Conn.DatabaseName := 'danilo';
      Conn.HostName := 'localhost';
      Conn.UserName := 'danilo';
      Conn.Password := 'danilo';
      Conn.Params.Add('port=5432');

      // Open the connection
      Conn.Connected := True;

      Transaction1 := TSQLTransaction.Create(nil);
      Transaction1.DataBase := Conn;

      Query1 := TSQLQuery.Create(nil);
      Query1.DataBase := Conn;
      Query1.Transaction := Transaction1;

      // Example query execution
      Transaction1.StartTransaction;
      Query1.SQL.Text := 'SELECT version() as version';
      Query1.Open;

      while not Query1.EOF do
        begin          
          WriteLn(Query1.FieldByName('version').AsString);
          Query1.Next;
        end;

      Query1.Close;
      Transaction1.Commit;
      Conn.Connected := False;

    except
      on E: Exception do
            writeln('An error occurred: ', E.Message);
    end;

  finally
    // Clean up resources
    if Assigned(Query1) then Query1.Free;
    if Assigned(Transaction1) then Transaction1.Free;
    if Assigned(Conn) then Conn.Free;
  end;
end.

我在編譯時遇到 "crtbegin.o" not found 的問題, 這是 /etc/fpc.cfg 設定的 C runtime library 的路徑找不到檔案(通常是因為 GCC 版本更新)。 解決方法是搜尋 crtbegin.o 的路徑,然後更新 /etc/fpc.cfg 的設定。

#ifdef cpux86_64
-Fl/usr/lib64/gcc/x86_64-suse-linux/15
#endif

下面是使用 ODBC 連線到 PostgreSQL 取得版本資訊的程式:

{$ifdef FPC} {$mode delphi} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}

program MyProgram;

uses 
SysUtils, SQLdb, ODBCConn;


var 
  Conn: TSQLConnection;
  Transaction1: TSQLTransaction;
  Query1: TSQLQuery;

begin
  Conn := TODBCConnection.Create(nil);
  try
    try
      Conn.Params.Add('DSN=PostgreSQL');
      Conn.Params.Add('UID=danilo');
      Conn.Params.Add('PWD=danilo');

      // Open the connection
      Conn.Connected := True;

      Transaction1 := TSQLTransaction.Create(nil);
      Transaction1.DataBase := Conn;

      Query1 := TSQLQuery.Create(nil);
      Query1.DataBase := Conn;
      Query1.Transaction := Transaction1;

      // Example query execution
      Transaction1.StartTransaction;
      Query1.SQL.Text := 'SELECT version() as version';
      Query1.Open;

      while not Query1.EOF do
        begin          
          WriteLn(Query1.FieldByName('version').AsString);
          Query1.Next;
        end;

      Query1.Close;
      Transaction1.Commit;
      Conn.Connected := False;

    except
      on E: Exception do
            writeln('An error occurred: ', E.Message);
    end;

  finally
    // Clean up resources
    if Assigned(Query1) then Query1.Free;
    if Assigned(Transaction1) then Transaction1.Free;
    if Assigned(Conn) then Conn.Free;
  end;
end.

參考連結

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。