我的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);
,但它无效。
怎么可能这样做? 感谢。
答案 0 :(得分:2)
在阅读和编辑数据时,您无需自己重新编码utf-8文本(例如,在OnGetText
事件中)。将UseUnicode
属性中的TUniConnection.SpecificOptions
选项设置为True
就足够了,例如,如下所示:
UniConnection1.SpecificOptions.Values['PostgreSQL.UseUnicode'] := 'True';
和UniDAC将自动执行此操作。
答案 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