Delphi 语言 触发器实现实战案例

Delphi阿木 发布于 2025-06-19 9 次阅读


Delphi 语言触发器实现实战案例

Delphi 是一种面向对象的编程语言,广泛应用于桌面应用程序的开发。触发器(Trigger)是数据库中的一种特殊类型的存储过程,它在特定事件发生时自动执行。在 Delphi 中,虽然不直接支持数据库触发器,但我们可以通过编写事件处理程序来模拟触发器的功能。本文将围绕 Delphi 语言触发器实现实战案例,探讨如何使用 Delphi 来模拟数据库触发器的行为。

案例背景

假设我们正在开发一个库存管理系统,其中包含一个 `Products` 表和一个 `Inventory` 表。`Products` 表存储产品信息,而 `Inventory` 表存储库存信息。我们需要在每次更新 `Inventory` 表时,自动更新 `Products` 表中的库存数量。

实现步骤

1. 创建数据库表

我们需要在数据库中创建两个表:

sql

CREATE TABLE Products (


ProductID INT PRIMARY KEY,


ProductName VARCHAR(100),


Stock INT


);

CREATE TABLE Inventory (


InventoryID INT PRIMARY KEY,


ProductID INT,


Quantity INT,


FOREIGN KEY (ProductID) REFERENCES Products(ProductID)


);


2. 创建 Delphi 项目

在 Delphi 中创建一个新的项目,并添加两个数据模块(DataModule1 和 DataModule2),分别用于连接数据库和操作表。

3. 配置数据库连接

在 DataModule1 中,配置数据库连接。这里以 FireDAC 为例:

delphi

TFDConnection DM1.Connection;


TFDQuery DM1.QProducts;


TFDQuery DM1.QInventory;

procedure TForm1.FormCreate(Sender: TObject);


begin


DM1.Connection.ConnectionString := 'YourConnectionString';


DM1.Connection.Open;


end;


4. 模拟触发器

在 DataModule2 中,创建一个事件处理程序来模拟触发器的行为。我们将使用 `QInventory.AfterInsert`、`QInventory.AfterUpdate` 和 `QInventory.AfterDelete` 事件来实现。

delphi

TFDQuery DM2.QInventory;


TFDQuery DM2.QProducts;

procedure TForm1.FormCreate(Sender: TObject);


begin


DM2.QInventory := TFDQuery.Create(nil);


DM2.QProducts := TFDQuery.Create(nil);

DM2.QInventory.Connection := DM1.Connection;


DM2.QProducts.Connection := DM1.Connection;

DM2.QInventory.AfterInsert := DM2.QInventoryAfterInsert;


DM2.QInventory.AfterUpdate := DM2.QInventoryAfterUpdate;


DM2.QInventory.AfterDelete := DM2.QInventoryAfterDelete;


end;

procedure TForm1.DM2QInventoryAfterInsert(DataSet: TDataSet);


begin


UpdateProductStock(DM2.QInventory.FieldByName('ProductID').AsInteger, DM2.QInventory.FieldByName('Quantity').AsInteger);


end;

procedure TForm1.DM2QInventoryAfterUpdate(DataSet: TDataSet);


begin


UpdateProductStock(DM2.QInventory.FieldByName('ProductID').AsInteger, DM2.QInventory.FieldByName('Quantity').AsInteger);


end;

procedure TForm1.DM2QInventoryAfterDelete(DataSet: TDataSet);


begin


UpdateProductStock(DM2.QInventory.FieldByName('ProductID').AsInteger, -DM2.QInventory.FieldByName('Quantity').AsInteger);


end;

procedure TForm1.UpdateProductStock(ProductID: Integer; Quantity: Integer);


begin


DM2.QProducts.Close;


DM2.QProducts.SQL.Text := 'UPDATE Products SET Stock = Stock + :Quantity WHERE ProductID = :ProductID';


DM2.QProducts.ParamByName('Quantity').AsInteger := Quantity;


DM2.QProducts.ParamByName('ProductID').AsInteger := ProductID;


DM2.QProducts.ExecSQL;


end;


5. 测试触发器

现在,我们可以通过添加、更新和删除 `Inventory` 表中的记录来测试触发器。每次操作后,`Products` 表中的库存数量应该自动更新。

delphi

procedure TForm1.Button1Click(Sender: TObject);


begin


DM2.QInventory.Close;


DM2.QInventory.SQL.Text := 'INSERT INTO Inventory (ProductID, Quantity) VALUES (1, 10)';


DM2.QInventory.ExecSQL;


end;

procedure TForm1.Button2Click(Sender: TObject);


begin


DM2.QInventory.Close;


DM2.QInventory.SQL.Text := 'UPDATE Inventory SET Quantity = 5 WHERE InventoryID = 1';


DM2.QInventory.ExecSQL;


end;

procedure TForm1.Button3Click(Sender: TObject);


begin


DM2.QInventory.Close;


DM2.QInventory.SQL.Text := 'DELETE FROM Inventory WHERE InventoryID = 1';


DM2.QInventory.ExecSQL;


end;


总结

通过以上步骤,我们使用 Delphi 语言模拟了数据库触发器的功能。在实际项目中,可以根据需要调整和扩展触发器的逻辑。虽然 Delphi 不直接支持数据库触发器,但通过事件处理程序,我们可以灵活地实现类似的功能。