2010-02-20 43 views
1

這是我的第三個問題在這裏,所以更優異的響應^^「鍵衝突」自動增量場

我有在瀏覽沒有問題,編輯數據,但插入...

這裏是我的疑問: 在金融/股票軟件我有一個表格,以創建一個新的秩序,
當然,我需要在t_orders
插入新行和t_orderitems表中插入項目與訂單ID場掛一排t_orders

CREATE TABLE `t_orders` (
    `orderId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `clientId` INT(10) UNSIGNED NOT NULL, 
    ...) 

CREATE TABLE `t_orderitems` (
    `orderitemId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `orderId` INT(10) UNSIGNED NOT NULL, 
    ...) 

--> INDEXES AND FOREIGN KEYS OMITTED <-- 

如何添加itemorders到網格,終於在 「FinalizeOrder」 按鈕,單擊

  • t_orders創建訂單
  • t_orderitems
  • 插入項目鏈接到爲了

使用ADO進行連接。

我不確定是否可以這樣做,在這種情況下,我應該怎麼做?

編輯:我試着使用嵌套ClientDataSets和它的部分工作,但我還是不知道怎麼去插入順序ID

EDIT2:
現在我有一個問題,我可以將多個項目添加到ClientDataSet中。
由於OrderItemId對於所有項目都是空的(我只能在數據庫插入時獲得該值),當我嘗試添加第二個項目時,它會給我提供關鍵違規,任何想法?

如果我設置的UpdateMode比upWhereKeyOnly不同的東西,並設置pfInKey爲False,它的工作原理,但我不認爲這是一個選項

任何想法?

在此先感謝!亞瑟。

+0

你用什麼數據庫? MySQL的? – RRUZ 2010-02-21 01:05:17

+0

是的,但我會在最終版本上更改爲PosgreSql – arthurprs 2010-02-21 01:09:15

+1

檢查mysql函數LAST_INSERT_ID(),看到這個鏈接http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html – RRUZ 2010-02-21 01:53:57

回答

1

我假設你有一個ADO數據集從數據庫獲取數據並鏈接到網格?你需要做的是一箇中間層。

創建一個TClientDataset並將其連接到您的ADO數據集,然後將該網格連接到客戶端數據集。當有新的訂單來到時,調用客戶端數據集的Append並將新訂單的數據插入到其中。這將使其顯示在網格上。如果要將更改保存到數據庫,請在客戶端數據集上調用.Update。它將使用它鏈接的ADO數據集將更新發送到數據庫。查看TClientDataset上的文檔以獲取有關如何完全設置的說明;它是近期版本中實際記錄得非常好的少數幾件事之一。

要更新多個表,請查看關於主/關係關係的文檔,並使用兩個這樣的數據集,它們彼此鏈接。

+0

感謝您的回覆。我想在這裏做什麼建議?我如何設置項目orderId的? – arthurprs 2010-02-20 18:37:09

+0

我不確定。我對AUTO_INCREMENT字段沒有任何經驗。 – 2010-02-20 18:43:48

0

感謝RRUZ,這不正是我想要的(我仍然不得不手動設置所有的OrderItems的OrderId的插入之前手動),但會做

with DataModule1.ADOQuery1 do 
begin 
    SQL.Text := 'SELECT LAST_INSERT_ID()'; 
    Open(); 
    First(); 
    LastInsertId := Fields[0].Value; 
    Close(); 
end; 
1

如果您之間的主從複合結構關係應用程序中的兩個數據集ADO可以自動處理它。這意味着,一旦將新記錄插入到主數據集(訂單)中,即可在細節數據集(order_items)中插入新記錄,而無需指定order_id,因爲master數據集中當前記錄的order_id將自動檢索,並且插入到細節數據集的新插入記錄中。

要在數據集之間建立主/細節關係,如果您要將AdoTable用於詳細數據集,可以將其MasterSource設置爲連接到主數據集的數據源,並使用MasterFields屬性定義兩個數據集之間的關聯關係。 如果您正在使用AdoDataset或AdoQuery,則應該將詳細數據集中的DataSource屬性設置爲連接到您的主數據集的數據源。然後,必須使用與主數據集中的鍵字段名稱相同的SQL參數在您的詳細數據集的SQL語句中添加WHERE子句。在你的情況下,它會是這樣的:

SELECT * FROM t_orderitems WHERE OrderID = :OrderID 

現在,您可以設置您的詳細信息數據的MasterFields特性的關係。

由於您的訂單可以有多個項目,因此您可以在詳細數據集(order_items)中將LockType設置爲ltBatchOptimistic,這樣一旦插入新項目,它就不會立即發送到數據庫。使用ltBatchOptimistic表示您的更改將臨時保存在客戶端內存中,直到您調用UpdateBatch方法。 UpdateBatch將所有更改發送到數據庫。

如果您要取消訂單,您必須調用CancelBatch方法以取消對詳細數據集所做的修改,並手動刪除主數據集中創建的訂單記錄。

+0

我這樣做了,但是當我不能在** Order **中添加多個** Items **時,我得到「key violation」,因爲2等於OrderItemId – arthurprs 2010-02-21 16:54:25

+0

如果該字段在您的表中定義爲AutoInc,那麼您的數據庫負責爲OrderItemID字段提供一個值,而不是你。您不應該將該字段的任何值傳遞給數據庫。順便說一句,你如何插入物品?你使用TDateset方法(例如Insert,Append),還是你手動編寫插入SQL語句? – vcldeveloper 2010-02-21 17:29:38

+0

我使用append將其添加到ClientDataSet中,並且將字段OrderItemId留空(這是因爲ClientDataSet不允許2等於ClientOrderId而導致的問題) – arthurprs 2010-02-21 18:32:14