FireDAC 下的 Sqlite [9] - 关于排序

SQLite 内部是按二进制排序, 可以支持 ANSI; FrieDAC 通过 TFDSQLiteCollation 支持了 Unicode 排序, 并可通过其 OnCompare 事件自定义排序.

下面的例子, 测试了这两种排序的不同.

可把下面代码直接贴在空白窗体上, 以快速完成窗体设计:
object DBGrid1: TDBGrid
  Left = 0
  Top = 0
  Width = 297
  Height = 199
  Align = alLeft
  DataSource = DataSource1
  TabOrder = 0
  TitleFont.Charset = DEFAULT_CHARSET
  TitleFont.Color = clWindowText
  TitleFont.Height = -11
  TitleFont.Name = 'Tahoma'
  TitleFont.Style = []
end
object Button1: TButton
  Left = 303
  Top = 24
  Width = 110
  Height = 25
  Caption = 'SQLite '#20869#32622#25490#24207
  TabOrder = 1
  OnClick = Button1Click
end
object Button2: TButton
  Left = 303
  Top = 65
  Width = 110
  Height = 25
  Caption = 'FireDAC '#40664#35748#25490#24207
  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 = 32
  Top = 88
end
object DataSource1: TDataSource
  DataSet = FDQuery1
  Left = 132
  Top = 88
end
object FDSQLiteCollation1: TFDSQLiteCollation
  DriverLink = FDPhysSQLiteDriverLink1
  CollationName = 'MyCollation'
  LocaleName = 'zh-CN'
  Left = 240
  Top = 120
end

代码:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  LCode: Integer;
begin
  {给 FDSQLiteCollation1 设定参数}
  FDSQLiteCollation1.DriverLink := FDPhysSQLiteDriverLink1;
//  FDSQLiteCollation1.CollationKind := scCompareString; //这是默认值(Unicode 不区分大小写, 在 Win 下是调用 WinAPI.CompareString); 使用其他选项需要自定义排序规则
  FDSQLiteCollation1.LocaleName := 'zh-CN';
  FDSQLiteCollation1.Flags := [sfIgnoreCase];
  FDSQLiteCollation1.CollationName := 'MyCollation';     //下面所有的调用全要依赖这个名称
  FDSQLiteCollation1.Active := True;

  FDConnection1.Params.Add('DriverID=SQLite');
//  FDConnection1.Params.Add('OpenMode=CreateUTF8'); //这是默认值, 可选 CreateUTF16(Unicode)

  {建立测试表, 三个字段 str(汉字), code(汉字对应的 Unicode 值), id(添加顺序)}
  FDConnection1.ExecSQL('CREATE TABLE MyTable(str string(10), code integer, id integer)');
//  FDConnection1.ExecSQL('CREATE TABLE MyTable(str string(10) COLLATE MyCollation, code integer, id integer)'); //用在表设计时

  {添加测试数据数据}
  for i := 0 to 99 do
  begin
    LCode := Random($9FA5-$4E00);
    FDConnection1.ExecSQL('INSERT INTO MyTable(str, code, id) VALUES(:1, :2, :3)', [WideChar($4E00 + LCode), LCode, i+1]);
  end;

  FDQuery1.Open('SELECT * FROM MyTable'); //无排序
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FDQuery1.Open('SELECT * FROM MyTable ORDER BY str'); //SQLite 内置排序
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FDQuery1.Open('SELECT * FROM MyTable ORDER BY str COLLATE MyCollation'); //FireDAC 默认排序
end;


测试效果图:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值