Unicode をサポートしたいので、Delphi 7 プロジェクトの 1 つを Delphi X3 に変換しています。データベース サーバーとして MS SQL Server 2008/R2 を使用しています。一部のデータベース フィールドを VARCHAR から NVARCHAR に (および付随する ClientDatasets のフィールドを ftWideString に) 変更した後、ランダム クラッシュが発生し始めました。デバッグ中に、TClientDataset/DbExpress による予期しない動作に気付きました。
NVARCHAR(10) データベース列の場合、clientdataset に TWideStringField を手動で作成し、'Size' プロパティを 10 に設定します。フィールドの 'DataSize' プロパティは、TWideStringField のエンコーディングが UTF-16 であるため、22 バイトが必要であることを示しています。 、そのため、文字ごとに 2 バイトと、長さを格納するためのスペースが必要です。ClientDataset で「CreateDataset」を呼び出し、データセットを XML に書き込むと (.SaveToFile を使用)、XML ファイルでフィールドは次のように定義されます。
<FIELD WIDTH="20" fieldtype="string.uni" attrname="TEST"/>
これは私には問題ないようです。
ここで、.CreateDataset を呼び出す代わりに、TClientDataset で .Open を呼び出して、リンクされたコンポーネント ->TDatasetProvider ->TSQLDataset (.CommandText = a simple select * from table) ->TSQLConnection を介してデータを取得します。ウォッチ リストでフィールドのプロパティを調べると、Size は 10 のままで、Datasize は 22 のままです。ただし、XML ファイルに保存した後、フィールドは次のように定義されます。
<FIELD WIDTH="40" fieldtype="string.uni" attrname="TEST"/>
..幅が2倍になった?
最後に、事前にフィールド定義をまったく作成せずに TClientDataset で .Open を呼び出すと、その後、フィールドのサイズは20 (正しくありません!)になり、データサイズは42 になります。XML に保存した後、フィールドは引き続き次のように定義されます。
<FIELD WIDTH="40" fieldtype="string.uni" attrname="TEST"/>
ここで何がうまくいかないのか誰にも分かりませんか?