Abh*_*eet 5 delphi unicode ado tadoquery delphi-6
我有一个在Delphi 6中开发的轮询应用程序.它读取文件,根据规范解析文件,执行验证并上传到数据库(SQL Server 2008 Express Edition)
我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如日语操作系统.因此,我们将SQL Server中的数据库字段从varchar更改为nvarchar.
轮询在使用DBCS的操作系统中工作正常.如果系统区域设置设置为日语/中文/韩语且操作系统具有相应的语言包,则它也可以成功用于非DBCS操作系统.但是,如果Locale设置为english,则数据库包含双字节字符的垃圾字符.
我进行了一些测试但未能确定解决方案.
例如,如果我使用TStringList 从UTF-8文件读取并将其保存到另一个文件,则保存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;
Run Code Online (Sandbox Code Playgroud)
以上代码在DBCS操作系统中正常工作.
我尝试过使用string,widestring和UTF8String.但是,如果语言环境设置为英语,则在英语操作系统中不起作用.
请提供此问题的任何指示.
在非 Unicode Delphi 版本中,基础知识是您需要使用WideString
s (Unicode) 而不是String
s (Ansi)。
忘记TADOQuery.SQL
(TStrings),并使用TADODataSet.CommandText
or TADOCommand.CommandText
(WideString) 或类型转换TADOQuery
为TADODataSet
. 例如:
stlTemp: TWideStringList; // <- Unicode strings - TNT or other Unicode lib
qry: TADOQuery;
stQuery: WideString; // <- Unicode string
TADODataSet(qry).CommandText := stQuery;
RowsAffected := qry.ExecSQL;
Run Code Online (Sandbox Code Playgroud)
您还可以使用TADOConnection.Execute(stQuery)
直接执行查询。
对参数化查询要格外小心:ADODB.TParameters.ParseSQL
是 Ansi。如果ParamCheck
为 true(默认情况下)TADOCommand.SetCommandText
->AssignCommandText
如果您的查询是 Unicode(InitParameters
是 Ansi),则会导致问题。
(请注意,您可以Command.Parameters
直接使用 ADO - 使用?
字符作为参数的占位符,而不是 Delphi 的约定:param_name
)。
QuotedStr
返回 Ansi 字符串。您需要此功能的宽版 (TNT)
另外,正如 @Arioch '提到的TNT Unicode Controls
套件是制作 Delphi Unicode 应用程序的最佳选择。它具有成功管理应用程序中的 Unicode 任务所需的所有控件和类。
简而言之,你需要广泛思考:)
归档时间: |
|
查看次数: |
5558 次 |
最近记录: |