Delphi 6で開発されたポーリングアプリケーションがあります。ファイルを読み取り、仕様に従ってファイルを解析し、検証を実行してデータベースにアップロードします(SQL Server 2008 Express Edition)
日本語 OS などの 2 バイト文字セット (DBCS) を持つオペレーティング システムのサポートを提供する必要がありました。そこで、SQL Server のデータベース フィールドを varchar から nvarchar に変更しました。
ポーリングは、DBCS を使用するオペレーティング システムで正常に機能します。システム ロケールが日本語/中国語/韓国語に設定されていて、オペレーティング システムにそれぞれの言語パックがある場合、DBCS 以外のオペレーティング システムでも正常に機能します。ただし、ロケールが英語に設定されている場合、データベースには 2 バイト文字のジャンク文字が含まれます。
いくつかのテストを実行しましたが、解決策を特定できませんでした。
たとえば、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 オペレーティング システムで正常に動作します。
文字列、ワイド文字列、UTF8文字列で遊んでみました。ただし、ロケールが英語に設定されている場合、これは英語 OS では機能しません。
この問題に関する指針を提供してください。