程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

「11.Lazarus数据库编程」2.Lazarus和PostgreSQL

balukai 2025-02-06 13:59:50 文章精选 4 ℃

2.Lazarus和PostgreSQL

2.1官方资料

【以下内容翻译自官方文档】

https://wiki.freepascal.org/Lazarus_Database_Tutorial/zh_CN#Lazarus_.E5.92.8C_PostgreSQL

如下图所示:

【翻译】

针对Lazarus 0.9.12及以后版本,连接到PostgreSQL数据库,本地或远程,使用TPQConnection组件。

正确安装后,请执行以下步骤:

1.从 SQLdb 选项卡放置 PQConnection

2.从 SQLdb 选项卡放置 SQLQuery

3.从 SQLdb 选项卡放置 SQLTransaction

4.从 DataAccess 选项卡放置 DataSource

5.从 DataControls 选项卡放置 DBGrid

6.在 PQConnection 中设置属性:

  • transaction - 相应 SQLTransaction 对象
  • Database name - 数据库名称
  • HostName - 主机名
  • UserName - 用户名
  • password - 密码
  • params - 其他连接参数,如果数据库使用的端口不是默认的 5432,则需要在该属性中填写 port=对应的端口

7.检查 SQLTransaction 是否已自动更改为指向 PQConnection,即 SQLTransaction 的 Database 属性是否为对应的 PQConnection 对象

8.在 SQLQuery 中设置属性:

  • transaction - 相应 SQLTransaction 对象
  • database - 相应 PQConnection 对象
  • SQL(类似于“ select * from anytable”)

9.在 DataSource 对象中,使用 SQLQuery 对象设置 DataSet 属性

10.在 DBGrid 中,填写 DataSource 对象作为数据源对象

11.将所有内容都设置为连接和活动,DBGrid 应该在设计时填充。TDBText和TDBEdit似乎有效,但(对我来说)它们只显示数据。

如果要更改数据库中的内容,我使用以下代码直接调用DB引擎:

try
   sql:= 'UPDATE table SET setting=1';
   PQDataBase.Connected:=True;
   PQDataBase.ExecuteDirect('Begin Work;');
   PQDataBase.ExecuteDirect(sql);
   PQDataBase.ExecuteDirect('Commit Work;');
   PQDataBase.Connected:=False;
 except
   on E : EDatabaseError do
     MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
   on E : Exception do
     MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
 end;

备注:

  • 在windows环境下,Lazarus 0.9.12、PgSQL 8.3.1上测试
  • 在部分linux环境下,Lazarus 0.9.12、PgSQL 8.0.x 上测试

安装和错误:

  • 在Lazarus的测试版本中,“text”和“numeric”类型的字段存在错误
  • 我使用了char fixed size、int和float8,没有问题
  • 有时重启Lazarus可以解决愚蠢的错误...
  • 出现一些错误后,事务仍处于活动状态,应手动停用
  • 在交易提交之前,Lazarus所做的更改当然是不可见的
  • 集成调试器似乎有问题(至少在windows中),有时在IDE之外运行可能有助于发现错误
  • 在linux中,某些错误消息会打印在控制台中,在命令行中运行程序,有时会有一些额外有用的调试信息
  • 对于错误:“无法加载Postgresql客户端。是否已安装(libpq.so)?”
  • Add the path to seach libpq* from the PostgreSQL installation.
  • In linux add the path to the libpq.so file to the libraries section in your /etc/fpc.cfg file. For example : -Fl/usr/local/pgsql/lib
  • In windows, add these libs anywhere in the Path environment variable or project dir
  • I windows, I copied all the DLLs in my C:\Program Files\PostgreSQL\8.1\bin dir to another dir in the PATH
  • Or add this postgres\bin dir to the path

2.2示例

示例:简单地展现一个 PostgreSQL 数据库中某个表的数据。

数据准备:

create table d_students1 (
    student_id varchar(64) primary key,
    name varchar(16),
    sex boolean,
    birthday date,
    department_id int4,
    total_score decimal(9,1)
);

INSERT INTO d_students1
(student_id, "name", sex, birthday, department_id, total_score)
VALUES('x-20210001', '张三', true, '2000-05-06', 1, 520);
INSERT INTO d_students1
(student_id, "name", sex, birthday, department_id, total_score)
VALUES('x-20210002', '李四', true, '2000-03-09', 1, 539);
INSERT INTO d_students1
(student_id, "name", sex, birthday, department_id, total_score)
VALUES('x-20210003', '周五', false, '2001-09-10', 2, 528);
INSERT INTO d_students1
(student_id, "name", sex, birthday, department_id, total_score)
VALUES('x-20210004', '赵六', true, '2000-08-28', 1, 517);
INSERT INTO d_students1
(student_id, "name", sex, birthday, department_id, total_score)
VALUES('x-20210005', '姜七', false, '2000-07-06', 2, 547);
INSERT INTO d_students1
(student_id, "name", sex, birthday, department_id, total_score)
VALUES('x-20210006', '贺八', true, '2000-11-01', 2, 533);

界面设计如下图所示:

窗体组件及其属性设置:

组件

属性

PQConnection1

DatabaseName

demodb


HostName

127.0.0.1


UserName

postgres


Password

***


Params

port=9432


Transaction

SQLTransaction1


Connected

True


KeepConnection

True


LoginPrompt

False

SQLTransaction1

Database

PQConnection1


Active

True

SQLQuery1

Database

PQConnection1


Transaction

SQLTransaction1


SQL

select * from d_students1


Active

True

DataSource1

DataSet

SQLQuery1

DBGrid1

DataSource

DataSource1


Align

alClient


Options

dgRowSelect=True

设置好后运行程序,显示如下:

最近发表
标签列表