• FireDAC 中文字段过滤问题


     当使用 FireDAC Filter  过滤数据的时候,通常这样写:

    FDMemTable.Filtered := False;
    FDMemTable1.Filter := '姓名=' + string(edtFilter.Text).QuotedString;
    FDMemTable.Filtered := True;

    将会报错:
    [FireDAC][Stan][Eval]-107. Invalid character found [ 姓名 = '张三' ]

    解决方法一:字段名称加上方括号[]

    FDMemTable1.Filter := '[姓名]=' + string(edtFilter.Text).QuotedString;

    解决方法二:通过 OnFilterRecord 事件处理

    procedure TForm1.OnMyFilterRecord(DataSet: TDataSet; var Accept: Boolean);
    begin
      Accept := DataSet.FieldByName('姓名').AsString = edtFilter.Text;
    end;

    附上完整代码,如下:

    unit Unit1;
    
    interface
    
    uses
      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.Param, FireDAC.Stan.Error,
      FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client,
      FireDAC.Stan.StorageBin, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids;
    
    type
      TForm1 = class(TForm)
        grd1: TDBGrid;
        ds1: TDataSource;
        btnFiltered: TButton;
        edtFilter: TEdit;
        procedure btnFilteredClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        Filter: string;
        FDMemTable: TFDMemTable;
        procedure OnMyFilterRecord(DataSet: TDataSet; var Accept: Boolean);
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    
    procedure TForm1.OnMyFilterRecord(DataSet: TDataSet; var Accept: Boolean);
    begin
      Accept := Filter.IsEmpty or (DataSet.FieldByName('姓名').AsString = Filter);
    end;
    
    procedure TForm1.btnFilteredClick(Sender: TObject);
    begin
      Filter := edtFilter.Text;
    
      FDMemTable.Filtered := False;
      // 方法一
      FDMemTable.Filter := '[姓名]=' + Filter.QuotedString;
      FDMemTable.Filtered := True;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FDMemTable := TFDMemTable.Create(Self);
    
      with FDMemTable do
      begin
        with FieldDefs do
        begin
          Clear;
          Add('姓名', ftWideString, 50);
          Add('年龄', ftInteger);
        end;
        CreateDataSet;
        AppendRecord(['张三', 35]);
        AppendRecord(['李四', 31]);
        AppendRecord(['王五', 40]);
        // 方法二
        // OnFilterRecord := OnMyFilterRecord;
      end;
      ds1.DataSet := FDMemTable;
    end;
    
    end.

    由于开发工具都是洋大人的,对中文支持不是太友好,防止出现不可预料的BUG,建议尽量不要使用中文字段名。

  • 相关阅读:
    tp6 控制器不存在:appindexcontrollerIndex
    thinkphp助手函数
    thinkphp5.1、thinkphp6
    lnmp安装
    关于像秒杀这种高并发场景的解决方案
    C# 基于hslcommunication的异步,同步,一对多,webapi等跨程序网络框架实现,适用程序-程序通信
    C# 调用Python脚本 python脚本反调用C#方法 python脚本调用另一个脚本
    C# webapi服务器,创建自定义的,简单的web服务器,供远程接口调用
    C# 创建mqtt服务器,mqtt发布数据,验证逻辑
    C# 实现 websocket 服务器 发送客户端网页前端数据,C#和网页前端通信
  • 原文地址:https://www.cnblogs.com/rtcmw/p/10811617.html
Copyright © 2020-2023  润新知