博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FireDAC 下的 Sqlite [8] - 自定义函数
阅读量:6798 次
发布时间:2019-06-26

本文共 4891 字,大约阅读时间需要 16 分钟。

Sqlite 本身没有这个功能, FireDAC 通过 TFDSQLiteFunction 增加了该功能; 尽管通过某些 SQL 语句或通过视图也可以达到类似效果, 但函数会更灵活些.
本例先建了一个成绩表, 然后通过两个 TFDSQLiteFunction 实现了 "总分" 与 "平均分" 的计算.

你可以复制下面文本框中的内容, 然后直接往窗体上贴, 以快速完成窗体设计:
object DBGrid1: TDBGrid Left = 8 Top = 88 Width = 321 Height = 89 DataSource = DataSource1 TabOrder = 0 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'Tahoma' TitleFont.Style = [] end object Button1: TButton Left = 382 Top = 88 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 1 OnClick = Button1Click end object Button2: TButton Left = 382 Top = 129 Width = 75 Height = 25 Caption = 'Button2' TabOrder = 2 OnClick = Button2Click end object FDConnection1: TFDConnection Left = 34 Top = 24 end object FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink Left = 143 Top = 24 end object FDGUIxWaitCursor1: TFDGUIxWaitCursor Provider = 'Forms' Left = 260 Top = 24 end object FDQuery1: TFDQuery Connection = FDConnection1 Left = 344 Top = 24 end object DataSource1: TDataSource DataSet = FDQuery1 Left = 420 Top = 24 end object FDSQLiteFunction1: TFDSQLiteFunction DriverLink = FDPhysSQLiteDriverLink1 Active = True FunctionName = 'MyFun1' ArgumentsCount = 3 OnCalculate = FDSQLiteFunction1Calculate Left = 48 Top = 200 end object FDSQLiteFunction2: TFDSQLiteFunction DriverLink = FDPhysSQLiteDriverLink1 Active = True FunctionName = 'MyFun2' ArgumentsCount = 3 OnCalculate = FDSQLiteFunction2Calculate Left = 152 Top = 200 end

代码:

unit Unit1;interfaceuses  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms,  Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.ExprFuncs, FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS,  FireDAC.DApt.Intf, FireDAC.DApt, Vcl.Grids, Vcl.DBGrids, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Comp.UI,  FireDAC.Phys.SQLite, Vcl.StdCtrls, FireDAC.Phys.SQLiteWrapper;type  TForm1 = class(TForm)    FDConnection1: TFDConnection;    FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink;    FDGUIxWaitCursor1: TFDGUIxWaitCursor;    FDQuery1: TFDQuery;    DataSource1: TDataSource;    DBGrid1: TDBGrid;    Button1: TButton;    Button2: TButton;    FDSQLiteFunction1: TFDSQLiteFunction;    FDSQLiteFunction2: TFDSQLiteFunction;    procedure FormCreate(Sender: TObject);    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);    procedure FDSQLiteFunction2Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);const  strTable = 'CREATE TABLE MyTable(姓名 string(10), 语文 Integer, 数学 Integer, 英语 Integer)'; // 建一个学生成绩表begin  { 建立一个成绩表, 并插入测试数据 }  FDConnection1.Params.Add('DriverID=SQLite');  FDConnection1.ExecSQL(strTable);  FDQuery1.ExecSQL('INSERT INTO MyTable(姓名, 语文, 数学, 英语) VALUES(:1, :2, :3, :4)', ['张三', 66, 77, 88]);  FDQuery1.ExecSQL('INSERT INTO MyTable(姓名, 语文, 数学, 英语) VALUES(:1, :2, :3, :4)', ['李四', 77, 88, 99]);  FDQuery1.Open('SELECT * FROM MyTable');  { 分别给两个 TFDSQLiteFunction 设定参数 }  FDSQLiteFunction1.DriverLink := FDPhysSQLiteDriverLink1;  FDSQLiteFunction1.FunctionName := 'MyFun1'; // 函数名  FDSQLiteFunction1.ArgumentsCount := 3; // 函数的参数个数  // FDSQLiteFunction1.OnCalculate := FDSQLiteFunction1Calculate; //在设计时建立 OnCalculate 事件更方便  FDSQLiteFunction1.Active := True;  FDSQLiteFunction2.DriverLink := FDPhysSQLiteDriverLink1;  FDSQLiteFunction2.FunctionName := 'MyFun2';  FDSQLiteFunction2.ArgumentsCount := 3;  // FDSQLiteFunction2.OnCalculate := FDSQLiteFunction2Calculate; //在设计时建立 OnCalculate 事件更方便  FDSQLiteFunction2.Active := True;end;{ 调用 MyFun1 }procedure TForm1.Button1Click(Sender: TObject);begin  FDQuery1.Open('SELECT 姓名, MyFun1(语文, 数学, 英语) AS 总分 FROM MyTable');end;{ 调用 MyFun2 }procedure TForm1.Button2Click(Sender: TObject);begin  FDQuery1.Open('SELECT 姓名, MyFun2(语文, 数学, 英语) AS 平均分 FROM MyTable');end;{ 函数 MyFun1 的定义: 算总分 }procedure TForm1.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);begin  AOutput.AsInteger := AInputs[0].AsInteger + AInputs[1].AsInteger + AInputs[2].AsInteger;end;{ 函数 MyFun2 的定义: 算平均分 }procedure TForm1.FDSQLiteFunction2Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);begin  AOutput.AsFloat := (AInputs[0].AsInteger + AInputs[1].AsInteger + AInputs[2].AsInteger) / 3;end;end.

效果图:
o_5.png

转载地址:http://tvego.baihongyu.com/

你可能感兴趣的文章
jQuery-可以编辑的表格
查看>>
mysql中kill掉所有锁表的进程
查看>>
php编译安装、加速及与nginx的整合
查看>>
Linux系统调优:提高磁盘吞吐量
查看>>
Hibernate5-一对多双向关联-左外连接-HQL
查看>>
项目管理001
查看>>
EBB-25、DNS3
查看>>
linux下安装ssh和利用ssh远程登录到另一台机器
查看>>
SecureCRT密钥远程ssh证书登录Linux
查看>>
句柄小悟
查看>>
Spring的理解
查看>>
我的友情链接
查看>>
iCloud1_Getting Started
查看>>
免费香港空间
查看>>
<ubuntu ping响应慢 延迟严重解决方案>
查看>>
mysql 安装
查看>>
java 消息摘要算法 SHA
查看>>
在ubuntu下配置C和C++的编译环境
查看>>
Linux系统开发 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程
查看>>
(转)delete和析构函数两者之间的联系
查看>>