2012-10-25 9 views
7

からレコードを削除し、私は左の外側を使用して2つの異なるテーブルからレコードを引っ張る参加:TADOQueryは、テーブルを結合 - 挿入単一<code>TADOQuery</code>を使用した結果

私は首尾よく私のMSSQL DBにフィールドの更新を投稿する TDBGridを使用
Select M*, D.* from Courier M Left outer join Courier_VT D on M.Courier_Identifier = D.FK_Courier_Identifier 

。外部キー参照(Courier_IdentifierFK_Courier_Identifier)私はレコードを挿入するとき、私はエラーを取得するがありますので

欄に「FK_Courier_Identifier」、テーブルCourier_VTの値のヌルを挿入することはできません。私は投稿する前にFK_Courier_IdentifierCourier_Identifierを割り当てる必要があることを知っていますが、ない方法と場所はどうすればよいことに

を行うにはない、列はNULL

ことはできませんが、レコードは、宅配便の表に掲載されていますこのシナリオではInsert \ Deleteレコードを使用しますか?単一のTADOQueryを使用することは可能ですか?

+3

「一意テーブル」ADO動的プロパティを使用できます。可能な重複[ここ](http://stackoverflow.com/questions/7981718/adodataset-deleting-from-joined-table)。しかし、 'Insert' \' Update'パーツが動作するかどうかは分かりません(私はこれを現在確認できません)。 'BeforePost'に' FK_Courier_Identifier'を指定する必要があると思います。 – kobik

答えて

1

AFAIK TADOQueryは、複数の表が結合されている場合に挿入/削除/更新文を処理できません。その背後にある理由は、どのテーブルを更新しなければならないか、またはどのようにそれを行うかを知ることができないからです。

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

これはおそらく、あなたのシナリオを扱うためにBeforeDeleteおよびBeforePostイベントハンドラを使用することです。基本的には、それらを使用してDML文を発行し、いくつかのstoredprocまたはSQLコンポーネントでそれを実行し、イベントハンドラを中止します。詳細およびコードサンプルについては、SO questionの回答を確認してください。


EDIT:あなたのコードが更新を処理して、あなたのコメントで言うように削除することができた場合、その問題だけ挿入にFK_Courier_Identifierの割り当てである(より慎重に質問を読んだことがあるはずです。.. 。)、あなたはOnBeforePostイベントハンドラを使用することによって解決することができた。ここで私は、フィールドを想定していますがvarcharであり、あなたがに挿入する前知っているので、もちろん

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

、あなたはこのコードを適応させる必要があります。 Courier IDの値をデータベース化します。

HTH

+0

ADOQueryはupdate \ deleteを処理できますが、挿入はできません。あなたのリンクに感謝しています! – user1775091

+0

あなたのコメントを読んだ後に私の答えを編集しました。それが今より良くなることを願っています! –

関連する問題