2

ソフトウェアに次の DBX 構造があります。

TSQLDataSet -> TDataSetProvider -> TClientDataSet

TClientDataSet のフィールドの 1 つで、Required プロパティが false に設定されています。これは、このフィールドがデータベース (Firebird) のトリガーとジェネレーターに基づいて自動インクリメントするためです。

しかし、TSQLDataSet と TClientDataSet の両方をこのフィールドが必須でないように構成した後、TClientDataSet からこのフィールドを読み取ろうとすると、非常に奇妙な結果が得られます。この状態で TClientDataSet にこのフィールドの値を強制的に取得させるには、何か特別なことをする必要があるのではないかと思います。

ここで何が欠けていますか?

前もって感謝します。

編集

Required プロパティのヘルプ ファイルには、これについての記述がありますが、何をしたいのかよくわかりませんでした。

説明

フィールドに空白以外の値が必要かどうかを指定します。

Required を使用して、フィールドに値が必要かどうか、またはフィールドを空白にすることができるかどうかを調べます。

フィールド エディターでフィールドが作成された場合、このプロパティは基になるテーブルに基づいて設定されます。値が必要なフィールド (パスワードや部品番号など) に対して Required を true に設定するが、基になるテーブルでフィールドが必要とされないアプリケーションは、プロパティを適用するために OnValidate イベント ハンドラーを作成する必要があります。

Required プロパティが基になるデータベース テーブルのプロパティを反映している場合、null 値をポスト適用しようとすると、例外が発生します。基になるテーブルがフィールドを必要としない場合に Required プロパティを true に設定するアプリケーションは、同じ結果を得るために、OnValidate イベント ハンドラーで null 値に対して EDatabaseError 例外を発生させる必要があります。

編集2

言い忘れましたが、TDataSetProvider と TClientDataSet の間には DataSnap 層があります (TClientDataSet 接続は DataSnap ドライバで行われます)。

編集3

この DataSnap セットアップで小さなテスト ケースを作成したところ、完全に機能しました。このプロジェクトはレガシーで乱雑で、私を悩ませているどこかであいまいなオプションを構成しているか、DataSnap のバグに遭遇したかのいずれかだと思います。

4

2 に答える 2

0

問題は、INTEGER として読み取られる古いフィールドであり、データベース内の SMALLINT であったようです。

この問題はデバッグが難しく、この質問は誤解を招くものでした。これをデバッグするのを手伝ってくれたみんなに感謝します。

于 2012-01-30T12:18:35.537 に答える
0

Haole、挿入後に TClientDataset.RefreshRecord を試しましたか? それとも TClientDataset.Refresh? ジェネレーターを使用すると、(ApplyUpdates を呼び出す前に) ジェネレーターを事前に取得して (select gen_id(generator,1) from RDB$Databaseメモリから取得するため、ここでテストするために Firebird を使用しないでください)、事前に PK フィールドに入力することもできます。

編集:これはハイゼンバグのようです。コンポーネントを削除して、最初から再構成しようとします(つまり、削除した後、Delphiを保存して閉じます)。

または、必要なクエリ構成のみで空のプロジェクトを作成し、そのデータを TDBGrid で表示してみてください。この問題が引き続き発生する場合は、FB インストールの一部のコンポーネントが破損している可能性があります (または Delphi インストールでさえ)。

于 2012-01-27T18:51:03.957 に答える