0

部屋間のリンクを含むグリッド上に部屋のマップ (グラフ) を作成するコードがあります。あるテーブルに部屋があり、別のテーブルにリンクがある Firebird データベースに保存されます。データは、DB Express TSimpleDataset データセットを通じて管理されます。

出口 (リンク) テーブルのクエリは次のようになります。

select
  EXITS.*,
  r1.x as x,
  r1.y as y,
  r2.x as x2,
  r2.y as y2 
from EXITS
inner join ROOMS r1 on r1.ROOM_ID = EXITS.ROOM1
inner join ROOMS r2 on r2.ROOM_ID = EXITS.ROOM2

問題は、新しい出口を追加して ApplyUpdates を呼び出すと、DBX の SQL パーサーが、ROOMS テーブルのフィールドが元のテーブルの一部ではなく便宜上存在することを理解していないように見えることです。以下を生成します。

insert into "EXITS"
  ("EXIT_ID", "AORDER", "AEXIT", "PREACTION", "POSTACTION", "COLOR", "ROOM1",
   "ROOM2", "MAP1", "MAP2", "X", "Y", "X2", "Y2")
values
  (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

加えて、予測可能な結果を​​伴う適切なパラメータ。XとYが挿入または更新されるべきではないことを理解させる方法を知っている人はいますか?

4

2 に答える 2

1

プロバイダー フラグを使用して、どのフィールドを更新する必要があるかを伝え、どのテーブルを更新する必要があるかをプロバイダーに伝えます (OnGetTableName イベントなどがあります)。もう 1 つのオプションは、OnBeforeUpdateRecord イベントを使用し、SQL ジェネレータに組み込まれている TDatasetProvider を使用せずに更新を実行するコードを記述することです。

于 2010-01-01T22:17:53.673 に答える
0

そのクエリの SQL は、まあ、データを返すことを目的としたクエリであり、挿入または更新には適していません。SimpleDataSet では双方向の使用が可能ですが、すべての状況を処理できるわけではありません。2 つの異なる単方向 ClientDataSet を作成します。1 つはクエリ用で、もう 1 つはクエリを使用する代わりにテーブルに直接アクセスします。

Martin Rudy の Getting Started with dbExpress からの引用:

より適切なアプローチは、ClientDataSet (CDS) と DataSetProvider を使用することです。CDS および DSP を使用したデータへの接続 CDS および DSP コンポーネントはどちらも Data Access コンポーネント パレットにあります。結果セットの定義には、dbExpress パレットの SQLDataSet コンポーネントが使用されます。SQLDataSet の SQLConnection プロパティは、SQLConnection コンポーネント名に割り当てられます。SQLDataSet CommandText プロパティは、SQL ステートメントを定義します。DSP の DataSet プロパティは、SQLDataSet コンポーネントの名前に設定されます。CDS コンポーネントには、DSP 名に設定された ProviderName プロパティがあります。プロパティ値の最後の変更は、CDS コンポーネント名に割り当てる必要がある DataSource DataSet プロパティに対するものです。CDS Active プロパティを True に設定する (または Open メソッドを使用する) と、データが取得されます。一見したところ、SimpleClientDataSet と比較すると、これは手間がかかりすぎると感じるかもしれません。CDS と DSP の機能を詳しく説明するにつれて、SimpleClientDataSet の代わりに DSP と CDS を使用する理由をよりよく理解できるようになります。

また、 UpdateModeおよびProviderFlagsプロパティの設定に関する章もお読みください。

レコードの検索と更新に使用されるデータセット内のフィールドの制御に関して、興味深い情報がたくさんあります。

ClientDataSets を使用すると、UpdateMode プロパティは DataSetProvider にあります。CDS/DSP コンポーネントの組み合わせ (SimpleClientDataset など) のいずれかを使用する場合、これらのコンポーネントには、内部 DataSetProvider のために UpdateMode プロパティがあります。

于 2010-01-01T18:35:25.697 に答える