Anydac コンポーネントを使用してデータベースにアクセスしています。TADOQuery は、SQL データベースからデータを選択するためのものです。
フィールドの 1 つはテキストですが、このテキストの代わりに RTF を表示する必要があります (同じテキストですが、単語が強調表示されているなど)。BLOB型の計算フィールドを作成し、TADQueryのOnCalcFieldsイベントで正しい値(DBからの原文+一部加工)を入れてみました。しかし、うまくいきません。アプリの起動時に AV を取得します。
「フィールド 'xxx' を計算フィールドまたはルックアップ フィールドにすることはできません。」.
FieldKind プロパティを fkInternalCalc (デフォルト値は fkCalculated) に変更すると、アプリが起動しますが、値を設定しようとすると OnCalcFields で AV が発生します。
"編集または挿入モードではないデータセット。"
(BLOB フィールドの代わりに) 計算文字列フィールドを定義すると、すべて問題ありませんが、文字列型には別の問題があります。文字列型の場合、テキストの最大サイズを制限する Size プロパティを提供する必要があります。また、64k を超える値 (たとえば 67000) を使用すると、OnCalcFields イベント ハンドラーで値 (短い値でも!) を割り当てようとすると AV が発生します。
プロジェクト xxx.exe は、"0x004094fc でのアクセス違反: アドレス 0xfffffffc の読み取り" というメッセージと共に例外クラス $C0000005 を発生させました。
そのため、計算 BLOB フィールドも計算文字列フィールドも作成できません。(最大サイズに制限があり、実際に安全な最大サイズに関する情報はありません。サイズが 64k を超えると問題が見つかりましたが、小さいブロックで安定するかどうかはわかりません。)
私が間違っていることはありますか?
更新:現時点では、別の方法で実装しました。プレゼンテーション レイヤーのデータを置き換えますが、これは単なる回避策であり、疑問はまだ残っています。Delphi で BLOB 型の計算フィールドを使用することは可能ですか (できれば Anydac TADQuery を使用)? 文字列型の計算フィールドの制限に関する情報はありますか (または、誰かがそれらを回避する方法を経験している可能性があります)。
procedure TDBDM.CommentsCalcFields(DataSet: TDataSet);
begin
CommentsHighlighted.AsString := 'test';
end;
したがって、TADQuery にはいくつかの SQL クエリがあり、いくつかのフィールドが定義されています + BLOB 型の 1 つの計算フィールド + OnCalcFields イベント ハンドラー (コードは上にあります)。アプリを起動すると(そしてクエリを開こうとすると)AVが生成されます。私が試した他のことは、以前に説明されていました。