加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 23:47:24 所属栏目:百科 来源:网络整理
导读:SQLite 内部是按二进制排序,可以支持 ANSI; FrieDAC 通过 TFDSQLiteCollation 支持了 Unicode 排序,并可通过其 OnCompare 事件自定义排序. 下面的例子,测试了这两种排序的不同. 可把下面代码直接贴在空白窗体上,以快速完成窗体设计: object DBGrid1: TDBGrid
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,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;

测试效果图:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读