Welcome

首页 / 软件开发 / Delphi / Delphi FireDAC 下的 Sqlite(九) 关于排序

Delphi FireDAC 下的 Sqlite(九) 关于排序2015-02-13SQLite 内部是按二进制排序, 可以支持 ANSI; FrieDAC 通过 TFDSQLiteCollation 支持了 Unicode 排序, 并可通过其 OnCompare 事件自定义排序.下面的例子, 测试了这两种排序的不同.

可把下面代码直接贴在空白窗体上, 以快速完成窗体设计:

代码:

procedure TForm1.FormCreate(Sender: TObject);vari: 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 := 0to99dobeginLCode := 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);beginFDQuery1.Open("SELECT * FROM MyTable ORDER BY str"); //SQLite 内置排序end;procedure TForm1.Button2Click(Sender: TObject);beginFDQuery1.Open("SELECT * FROM MyTable ORDER BY str COLLATE MyCollation"); //FireDAC 默认排序end;
测试效果图:

Author:cnblogs 万一