我有一个用Delphi 6开发的轮询应用程序,它读取文件,根据规范解析文件,执行验证并上传到数据库( Server 2008速成版)
我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如日本操作系统。因此,我们将Server中的数据库字段从varchar改为nvarchar。
轮询在DBCS操作系统中运行良好。如果系统区域设置为日文/中文/韩文,并且操作系统有相应的语言包,则它也可以成功地用于非DBCS操作系统。但是,如果区域设置为english,则数据库包含双字节字符的垃圾字符。
我做了一些测试,但没能识别出解决方案。
例如,如果我使用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;以上代码在DBCS操作系统中运行良好。
我试过玩弦乐、宽弦和UTF8String。但是,如果区域设置为English,则这在英语操作系统中不起作用。
请提供有关此问题的任何指示。
发布于 2013-01-10 11:56:00
在非Unicode Delphi版本中,您需要使用WideStrings (Unicode)而不是Strings (Ansi)。
忘记TADOQuery.SQL (TStrings),使用TADODataSet.CommandText或TADOCommand.CommandText(WideString)或作为TADODataSet的类型化TADOQuery。例如:
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是Ansi。如果ParamCheck为true (默认情况下),则如果查询为Unicode (InitParameters为Ansi),则TADOCommand.SetCommandText->AssignCommandText将导致问题。
(请注意,您可以直接使用ADO Command.Parameters -使用?字符作为参数的占位符,而不是德尔菲的约定:param_name)。
QuotedStr返回Ansi字符串。您需要此功能的宽版本(TNT)。
另外,正如“Arioch”所提到的TNT Unicode Controls套件是制作Delphi应用程序的最佳选择,它拥有成功管理应用程序中Unicode任务所需的所有控件和类。
简而言之,您需要考虑Wide :)
发布于 2013-01-10 08:54:58
TWideStringList或绝地CodeLibrary TJclWideStringList加载它。检查您从未使用字符串变量处理数据的代码--使用WideString everywhere以避免数据丢失。
由于D6是最错误的版本之一,所以我更愿意确保安装了Delphi的每一个更新,然后安装和使用JCL。JCL还提供了代码页转换函数,这可能比普通的AnsiStringVar := WideStringVar方法更灵活。
对于UTF-8文件,它可以由JCL的TWideStringList类(但不是TJclWideStringList)加载。WideString变量,并确保它们的内容被保留。SQL VARCHAR参数是否为ftWideString,以包含Unicode,而不是ftString。检查有关字段(列)的相同内容。https://stackoverflow.com/questions/14250491
复制相似问题