14

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"/>

ここで何がうまくいかないのか誰にも分かりませんか?

4

2 に答える 2

0

SQLCommand コンポーネント (DatasetProvider の前) で fieldtype とそのサイズを確認します。

サイズが 2 倍になるのは、2 つの暗黙的な「変換」の結果である可能性があります。1 つ目 - サーバーは、ansi-string フィールドに格納される NVarchar データを提供し (そして、すべてのバイトが個別の文字になります)、2 つ目 - クライアントデータセットの Widestring 型のフィールドに格納され、それぞれ文字は 2 バイト (サイズは 2 倍) になります。

以前のバージョンの Delphi 文字列フィールドでは、ClientDataset のフィールドと対応するクエリ/コマンド フィールドのサイズが一致していなくても、例外は発生しませんでしたが、XE* のいずれかから開始すると、多くの場合、AV が発生することに注意してください。そのため、移行中に文字列フィールドのサイズを注意深く確認する必要があります。

于 2016-02-13T12:44:20.850 に答える