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


本文整理自网络,侵删。

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

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

代码:
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;

测试效果图:

相关阅读 >>

Delphi 用firedac获取 sql server错误文本信息

Delphi richedit 加入链接

Delphi异常信息捕捉

Delphi使用tclientdataset时不携带midas.dll的方法

Delphi取得当前目录的上一级目录

Delphi twebbrowser 屏蔽右键菜单

Delphi 安卓 app 动态权限申请

Delphi获取开机时间代码

Delphi中使用tpathanimation

Delphi windows 编程[19] - 改变菜单项的状态: getmenustate、enablemenuitem

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...