2

次のコントロールを持つフォームがあります: TDBEditTDBMemoTDataSourceTClientDataSet

ユーザーがフィールドを編集し、メソッドを呼び出すだけのフォーム上のボタンをクリックするとMyCDS.Cancel(編集をキャンセルするため)、TDBEditフィールドは元の値に戻りますが、TDBMemoフィールドは元に戻されません (空の値に設定されます)。

TClientDataSet、MSSQLServer 2008 データベースから取り込まれます。TDBEditフィールドはデータベースnvarchar(255)にあり、TDBMemoまたはnvarchar(max)フィールドxmlです。

Debug Inspector (ctrl+F7、MyCDS.FieldByName('afield')、Inspect) で値を見ると、nvarchar(max)フィールドの 1 つについて次のように表示されます。

  • データサイズ = 0
  • データ型 = ftWideMemo
  • サイズ = 1

これは、基になるフィールドにデータがあるかどうかに関係なく、すべてのフィールドnvarchar(max)とフィールドで同じです。xml

nvarchar(max)( として扱われるftWideMemo) とTDBMemoコントロールの間に非互換性があるようです。

誰もこのような問題を見たことがありますか? それを解決する方法について何か提案はありますか?

4

1 に答える 1

0

興味のある方のために説明すると、問題はTClientDataSetコンポーネントのバグです。この問題は、データセットを複製し、 を持たず、オフにした場合にのみ発生しProviderますLogChanges。複製されたデータセットのレコードを編集してから編集をキャンセルすると、すべてのメモフィールドの値が失われます。

Providerファイルベースのアプリケーションでは必ずしも を使用するとは限らないため、 を有効にすることが常に意味があるとは限りませんLogChangesただし、メモフィールドの制限を回避するには、そのままにして、複製されたデータセットを変更する操作の後LogChangesに呼び出すことができます。MergeChangeLog

問題を示すプログラムを作成しました。Embarcadero インシデント QC#110511 を参照してください。

于 2012-11-15T23:09:26.983 に答える