ADOTable 组件属于数据集组件,使用该组件可用建立数据库表及索引,对已经存在的数据表进行插入、删除、修改等操作。
在 Delphi 中,提供了 Table、Query、StoredProc 等组件来处理数据。一般情况下,对于桌面数据库来说,使用 Table 组件效率最好,而对于 SQL 数据来说,使用 Query 组件避免了 SQL 语句的转化,效率会更高,对于处理过程比较复杂、数据量大的 SQL 操作,最好使用存储过程来操作。
ADOTable 组件位于 dbGo 页上,通过 ADO 连接到数据库上,从一个物理数据表中取出数据,并通过 TDataSource 组件把数据提供给一个或多个数据控制组件;另一方面,可以把用户通过数据控制组件输入的数据发送给物理数据库。
7.1ADOTable组件的主要属性- Connection
指定访问数据库所使用的 ADOConnection 组件
- ConnectionString
指定连接字符串,在不使用 ADOConnection 组件的情况下,也可以直接连接数据库
- Active
表示是否与数据库建立连接,取值为布尔类型:True / False,如果设置为 True,则表示与数据库建立连接,可以访问数据库;否则,表示数据集处于关闭状态,不能访问数据库表。
使用 Open 和 Close 方法对数据库表的操作效果进行修改 Active 属性的效果是一致的。
- TableName
指定访问的数据库表的名称。
- ReadOnly
表示是否只读,如果设置为 True,表示数据库表的数据不能被修改,可以防止数据库表中的记录被修改。
- Bof
表示当前记录指针所处的位置是否为数据表的第一条记录,属性值为布尔型
- Eof
表示当前记录指针所处的位置是否为数据表的最后一条记录,属性值为布尔型
如果 Bof 和 Eof 都为 True 的话,则数据表为空表
- CanModify
表示数据库表是否可用被修改,属性值为布尔型,如果设置为 True,则表示可以被修改,否则表示不可被修改,如果表组件的 ReadOnly 设置为 True,则该属性将被设置为 Fasle。
- Modified
表示数据库表是否已经被修改,取值为布尔型
7.2ADOTable组件的主要方法1.打开与关闭
- Open - 打开数据库表,Active 属性设置为 True
- Close - 关闭数据库表,Active 属性设置为 False
2.浏览数据
- First - 将记录指针移动到第一条记录
- Last - 将记录指针移动到最后一条记录
- MoveBy - 将记录指针移动到与当前记录相关的某一记录处,格式:
function MoveBy(Distance: Integer): Integer;
其中,Distance表示要移动的记录数目,取值为正数时表示向下移动,为负数时表示向上移动。
返回实际一定的记录数目。
- Next - 将记录指针后移一条记录
- Prior - 将记录指针前移一条记录
3.编辑数据
- Append - 在数据库表的末尾添加一条新的空间记录并将该记录设置为当前记录。
- Delete - 将当前记录从数据库表中删除。
- Edit - 编辑数据库表的当前记录。
- Insert - 在数据库表中插入一条新的空间记录,并将该记录设置为当前记录。
- InsertRecord - 在数据库表中建立一个新的记录,与 Insert 的不同之处,直接将新记录的字段值以参数形式传递,且不需要调用 Post 方法。格式:
procedure InsertRecord(const Values: array of const);
该方法会将缺少的字段值处理为 Null 值。
- Post - 向数据库提交修改的记录。
- SetFields - 以参数形式修改当前记录中的多个字段值。格式:
procedure SetFields(const Values: array of const);
其中:Values 中包含将插入的每个字段的值,其顺序是根据表中字段的先后顺序决定的,缺少的字段会作为 Null 值处理。
- Cancel - 取消对数据表的修改。在数据更改未提交的情况下,该方法使记录恢复到修改前的状态。
4.书签的使用
使用书签可以在数据表上快速定位记录指针。Delphi 支持在当前记录上标记书签,以便在后面能够快速返回到书签的位置。
- GetBookMark - 用于设置书签,返回一个 TBookMark 类型的值。格式:
function GetBookmark: TBookmark;
- GotoBookMark - 快速将记录指针定位到书签的位置处。格式:
procedure GotoBookmark(Bookmark: TBookmark);
- FreeBookMark - 释放书签,格式:
procedure FreeBookmark(Bookmark: TBookmark);
5.查询数据记录
- Locate - 查询数据记录,格式:
function Locate(const KeyFields: string;
const KeyValues: Variant;
Options: TLocateOptions): Boolean;
其中:
- KeyFields - 用逗号分隔的查询字段名称
- KeyValues - 要查询的字段值
- Options - 查询选项,如果包含loCaseInsensitive,则查询时不区分 KeyValues 中的大小写;如果包含 loPartialKey 时,可以实现近似查询
界面如下:
所使用的组件及属性:
组件 | 属性 | 值 |
Panel1 | Caption | '' |
Align | alTop | |
Label1 | Caption | '姓名' |
Edit1 | Text | '' |
Button1 | Caption | '查找' |
ADOConnection1 | ConnectionString | Provider=MSDASQL.1;Persist Security Info=False;Data Source=demodb |
LoginPrompt | False | |
Connected | True | |
ADOTable1 | Connection | ADOConnection1 |
TableName | d_students | |
Active | True | |
DataSource1 | DataSet | ADOTable1 |
DBGrid1 | Align | alClient |
DataSource | DataSource1 |
示例代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
chinese, math, english, total: Double;
begin
if ADOTable1.Locate('name', Edit1.Text, [loPartialKey]) then
begin
chinese := ADOTable1.FieldByName('chinese').AsFloat;
math := ADOTable1.FieldByName('math').AsFloat;
english := ADOTable1.FieldByName('english').AsFloat;
total := chinese math english;
Panel2.Caption := ADOTable1.FieldByName('name').AsString ':' floattostr(total);
end
else
Panel2.Caption := '未找到';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOTable1.FieldByName('student_id').DisplayLabel := '学号';
ADOTable1.FieldByName('name').DisplayLabel := '姓名';
ADOTable1.FieldByName('sex').DisplayLabel := '性别';
ADOTable1.FieldByName('chinese').DisplayLabel := '语文';
ADOTable1.FieldByName('math').DisplayLabel := '数学';
ADOTable1.FieldByName('english').DisplayLabel := '英语';
ADOTable1.FieldByName('student_id').DisplayWidth := 16;
end;
7.4主从结构数据表
在 Delphi 中,通过主从结构显式地支持主从结构的数据表关系。
主从结构数据表关系设置相关的主要属性:
- MasterSource
- MasterFields
示例:
数据准备:
create table c_department (
department_id int4 primary key,
department_name varchar(16)
);
INSERT INTO c_department
(department_id, department_name)
VALUES(1, '计算机系');
INSERT INTO c_department
(department_id, department_name)
VALUES(2, '土木工程系');
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);
界面设计如下图:
组件属性设置如下:
组件 | 属性 | 值 |
ADOConnection1 | ConnectionString | Provider=MSDASQL.1;Persist Security Info=False;Data Source=demodb; |
Connected | True | |
LoginPrompt | False | |
ADOTable1 | Connection | ADOConnection1 |
Active | True | |
TableName | c_department | |
DataSource1 | DataSet | ADOTable1 |
ADOtable2 | Connection | ADOConnection1 |
Active | True | |
TableName | d_students1 | |
MasterSource | DataSource1 | |
MasterFields | department_id | |
DataSource2 | DataSet | ADOTable2 |
DBGrid1 | DataSource | DataSource1 |
DBGrid2 | DataSource | DataSource2 |
设置 MasterFields 的方法,单击从表组件 ADOTable2 的属性 MasterFields 设置框右侧的 ... 按钮,进入关联字段的设置对话框,如下图所示:
通过该对话框将从表的关联字段与主表的关联字段建立联系即可。
7.5字段编辑器在 TADOTable 组件上右击选择 Fields Editor,即可打开字段编辑器,在字段编辑器中增加固定字段并进行编辑,如下图:
- 在字段编辑器中定义计算字段:
选择 ADOTable2 ,右击选择 Fields Editor,添加所有字段为固定字段,然后选择 NewField,如下图:
设置Name、Type、FieldType,本例设置:
Name | avg_score |
Type | Float |
FieldType | Calculated |
编写 ADOTable2 的 OnCalcFields 事件代码:
procedure TForm1.ADOTable2CalcFields(DataSet: TDataSet);
begin
ADOTable2avg_score.Value := round(ADOTable2total_score.AsFloat / 6.0 * 10) / 10;
end;
- 在字段编辑器中定义查看字段:
在字段编辑器中右击选择 New Field,设置如下图所示:
通过上面的设置,在 ADOTable2 中增加了 department_name 的显示,其数据来自于 ADOTable1 中。
- 在字段编辑器中拖放
无论是计算字段、查看字段,以及数据表字段,均可以在字段编辑器中通过拖放操作来调整显示顺序。