7

TADOQuery左外部結合を使用して、2 つの異なるテーブルから 単一のi pull レコードを使用します。

Select M*, D.* from Courier M Left outer join Courier_VT D on M.Courier_Identifier = D.FK_Courier_Identifier

を使用して、TDBGridフィールドの更新を MSSQL DB に正常に投稿します。

外部キー参照( FK_Courier_Identifierwith Courier_Identifier)があるので、レコードを挿入するとエラーになり、

Null 値を列 'FK_Courier_Identifier'、表 Courier_VT に挿入できません。列は null を許可しません

Courier_Identifierしかし、レコードはクーリエテーブルに投稿されます。投稿する前ににを割り当てる必要があることは知ってFK_Courier_Identifierいますが、どこでどのように行うべきかわかりません

このシナリオでレコードを挿入/削除するにはどうすればよいでしょうか? 単一のを使用して達成することは可能TADOQueryですか?

4

1 に答える 1

1

AFAIK TADOQueryは、複数のテーブルが結合されている場合、挿入/削除/更新ステートメントを処理できません。その背後にある理由は、更新する必要のあるテーブルやその方法を認識できないためです。

他のデータベースアクセスコンポーネントでの通常のアプローチは、DMLセンテンスのタイプごとにプロパティを提供するか(ODACコンポーネントが1つの例です)、DMLセンテンスを含むクエリにリンクされた2番目の「SQL更新」コンポーネントを追加する必要があります(Zeosは、このアプローチを使用するコンポーネントの一例です)。

そうは言っても、おそらく最善の策は、BeforeDeleteおよびBeforePostイベントハンドラーを使用してシナリオを処理することです。基本的には、それらを使用してDMLセンテンスを発行し、storedprocまたはsqlコンポーネントを使用して実行してから、イベントハンドラーを中止します。詳細とコードサンプルについては、このSOの質問に対する受け入れられた回答を確認してください。


編集:あなたがコメントで言うようにあなたのコードが更新と削除を処理できるなら、問題はFK_Courier_Identifier挿入時の割り当てにのみあります(質問をもっと注意深く読むべきです...)、それはあなたが使用することによって解決することができますOnBeforePostイベントハンドラー:

procedure TMyForm.MyADOQueryBeforePost(Sender: TObject);
begin
  MyADOQuery.FieldByName('FK_Courier_Identifier').AsString := CourierId;
end;

もちろん、このコードを適応させる必要があります。これは、フィールドがavarcharであり、データベースにCourierIDの値を挿入する前に知っていると想定しているためです。

HTH

于 2012-10-26T07:23:30.050 に答える