1

我的 Delphi 应用程序使用 PostgreSQL 数据库(带有 UniDac 组件)。数据以 UTF8 格式存储在数据库中。要读取国际字符,我使用这个处理程序:

procedure TdmMain.OnGetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
  Text := Utf8decode (Sender.AsString);
end;

但是,如何将数据存储回数据库?我创建了另一个处理程序,OnSetTextSender.AsString := Utf8Encode (Text);但它不工作。

怎么可能做到这一点?谢谢。

4

2 回答 2

2

读取和编辑数据时,不需要自己重新编码 utf-8 文本(例如在 OnGetText事件中)。将属性中的UseUnicode选项设置为 就足够了,例如,如下所示:TUniConnection.SpecificOptionsTrue

UniConnection1.SpecificOptions.Values['PostgreSQL.UseUnicode'] := 'True';

UniDAC 会自动执行此操作。

http://www.devart.com/unidac/docs/pgsqlprov_article.htm

于 2013-07-22T14:45:28.177 回答
1

虽然这个问题很老,而且我同意翻译应该自动发生,但有时它根本不起作用。我的解决方法是在一个包中定义一个 TStringField 后代:

unit MyField;
.
.
.
Type 

TMyStringField = class(TStringField)
  protected
    procedure SetAsString(const Value: string); override;
    Function GetAsString : String; Override;
  end;

  function TMyStringField.GetAsString: String;
  begin
    Result := inherited Utf8ToAnsi (GetAsString)
  end;

  procedure TMyStringField.SetAsString(const Value: string);
  begin
    inherited SetAsString(AnsiToUtf8(Value))
  end;

不要忘记注册此字段:

Procedure Register;
begin
  RegisterFields([TMyStringField]);
end;

从帮助:

调用 RegisterFields 以允许 TField 的自定义后代出现在新字段对话框的字段类型下拉列表中。

FieldClasses 参数是一个 TField 后代数组。在 C++ 中,FieldClasses_Size 是数组中最后一个类的索引(比类类型的数量少一个)。

这种方法的缺点是必须手动添加字段,或者将TStringField替换为TMyStringField

于 2020-07-22T14:15:14.073 回答