我有一个用 Delphi 6 开发的轮询应用程序。
它读取文件,根据规范解析文件,执行验证并上传到数据库(SQL Server 2008 精简版)
我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如日本操作系统。
因此,我们将 SQL Server 中的数据库字段从 varchar 更改为 nvarchar。
轮询在具有 DBCS 的操作系统中运行良好。它也适用于非 DBCS 操作系统,如果
系统区域设置设置为日文/中文/韩文,操作系统有相应的语言包。
但是,如果区域设置设置为英语,那么数据库将包含双字节字符的垃圾字符。
我进行了一些测试,但未能找到解决方案。
例如如果我读到UTF-8使用 TStringList 文件并将其保存到另一个文件,然后保存 Unicode 数据。
但是,如果我使用文件的内容使用 TADOQuery 组件运行更新查询,则会显示垃圾字符。
该数据库还包含垃圾字符。
PFB示例代码:
var
stlTemp : TStringList;
qry : TADOQuery;
stQuery : string;
begin
stlTemp := TStringList.Create;
qry := TADOQuery.Create(nil);
stlTemp.LoadFromFile('D:\DelphiUnicode\unicode.txt');
//stlTemp.SaveToFile('D:\DelphiUnicode\1.txt'); // This works. Even though
//the stlTemp.Strings[0] contains junk characters if seen in watch
stQuery := 'UPDATE dbo.receivers SET company = ' + QuotedStr(stlTemp.Strings[0]) +
' WHERE receiver_cd = N' + QuotedStr('Receiver');
//company is a nvarchar field in the database
qry.Connection := ADOConnection1;
with qry do
begin
Close;
SQL.Clear;
SQL.Add(stQuery);
ExecSQL;
end;
qry.Free;
stlTemp.Free
end;
上面的代码在 DBCS 操作系统中运行良好。
我尝试过使用 string、widestring 和 UTF8String。但是,如果语言环境设置为英语,则这在英语操作系统中不起作用。
请提供有关此问题的任何指示。
在非 Unicode Delphi 版本中,基础知识是您需要使用WideString
s (Unicode) 而不是String
s(安西)。
把...忘了吧TADOQuery.SQL
(TStrings),并与TADODataSet.CommandText
or TADOCommand.CommandText
(WideString) 或类型转换TADOQuery
as TADODataSet
. e.g:
stlTemp: TWideStringList; // <- Unicode strings - TNT or other Unicode lib
qry: TADOQuery;
stQuery: WideString; // <- Unicode string
TADODataSet(qry).CommandText := stQuery;
RowsAffected := qry.ExecSQL;
您还可以使用TADOConnection.Execute(stQuery)
直接执行查询。
对参数化查询要格外小心:ADODB.TParameters.ParseSQL
是安西。如果ParamCheck
为 true(默认)TADOCommand.SetCommandText
->AssignCommandText
会引发
如果您的查询是 Unicode (InitParameters
是安西)。
(请注意,您可以使用 ADOCommand.Parameters
直接使用?
字符作为参数的占位符,而不是 Delphi 的约定:param_name
).
QuotedStr
返回 Ansi 字符串。您需要此功能的宽版 (TNT)
另外,正如@Arioch'提到的TNT Unicode Controls套件是您制作 Delphi Unicode 应用程序的最佳选择。
它具有成功管理应用程序中的 Unicode 任务所需的所有控件和类。
简而言之,你需要思考Wide :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)