它读取文件,根据规范解析文件,执行验证并上传到数据库(sql Server 2008 Express Edition)
我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如:日本OS.
因此,我们将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;
以上代码在DBCS操作系统中正常工作.
我尝试过使用string,widestring和UTF8String.但是,如果语言环境设置为英语,则在英语操作系统中不起作用.
请提供此问题的任何指示.
解决方法
忘记TADOQuery.sql(TStrings),并使用TADODataSet.CommandText或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;
您还可以使用TADOConnection.Execute(stQuery)直接执行查询.
使用参数化查询时要格外小心:ADODB.TParameters.Parsesql是Ansi.如果ParamCheck为true(默认情况下)TADOCommand.SetCommandText-> AssignCommandText将导致
如果您的查询是Unicode(InitParameters是Ansi),则会出现问题.
(请注意,您可以直接使用ADO Command.Parameters – 使用?chars作为参数的占位符而不是Delphi的约定:param_name).
QuotedStr返回Ansi字符串.你需要这个功能的宽版本(TNT)
另外,As @Arioch’上面提到的TNT Unicode Controls
套件是制作Delphi Unicode应用程序的最佳选择.
它具有在应用程序中成功管理Unicode任务所需的所有控件和类.
总之,你需要思考宽:)