2012-10-25 62 views
7

使用單一TADOQuery我拉使用左外兩個不同表中的記錄加入:TADOQuery加入表 - 插入刪除記錄從結果

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

我用TDBGrid成功後現場更新到我的MSSQL數據庫。

由於有外鍵引用(FK_Courier_IdentifierCourier_Identifier)我得到一個錯誤,當我插入一條記錄,

不能插入null值列「FK_Courier_Identifier」,表Courier_VT;列不允許空

但記錄被張貼在快遞表,我知道我需要在發佈前將Courier_Identifier分配給FK_Courier_Identifier但不如何以及在哪裏做

怎麼辦我們在此場景中插入\刪除記錄?是否有可能實現使用單個TADOQuery

+3

您可以使用'Unique Table' ADO動態屬性。一個可能的重複[這裏](http://stackoverflow.com/questions/7981718/adodataset-deleting-from-joined-table)。但是我不確定'Insert''' Update'部分是否可以工作(我現在無法驗證)。我相信你需要在'BeforePost'上指定'FK_Courier_Identifier'。 – kobik

回答

1

當多個表連接時,AFAIK TADOQuery無法處理插入/刪除/更新語句。它背後的原因是它無法知道哪些表必須更新或如何去做。

其他數據庫訪問組件的常用方法是爲每種類型的DML語句提供一個屬性(ODAC components就是一個示例),或者您必須添加第二個鏈接到您的查詢的「更新SQL」組件,該組件包含DML語句(Zeos是使用此方法的組件的一個示例)。

說這個,可能你最好的選擇是使用BeforeDelete和BeforePost事件處理程序來處理你的場景。基本上你會用它們來發出DML語句,用一些storedproc或sql組件執行它,然後中止事件處理程序。查看此SO question的接受答案以獲取更多信息和代碼示例。


編輯:如果你的代碼可以處理更新,併爲您在您的評論說刪除,那麼問題只出在FK_Courier_Identifier對插入分配(應該更仔細了問題.. ),您可以通過使用OnBeforePost中事件處理程序解決:

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

當然,你需要,因爲我在這裏假設的領域是varchar適應這個代碼並且您知道在插入之前,數據庫Courier ID的值。

HTH

+0

ADOQuery能夠處理更新\刪除但不插入,我正在尋找您的鏈接謝謝! – user1775091

+0

我在閱讀您的評論後編輯了我的答案。希望它現在有更好的幫助! –