Delphi编辑unicode表数据

时间:2013-07-22 11:55:59

标签: delphi postgresql delphi-xe2 dbgrid unidac

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

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

但是,如何才能将数据存储回数据库? 我使用OnSetText创建了另一个处理程序Sender.AsString := Utf8Encode (Text);,但它无效。

怎么可能这样做? 感谢。

2 个答案:

答案 0 :(得分:2)

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

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

和UniDAC将自动执行此操作。

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

答案 1 :(得分: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