2015-09-27 117 views
0

我加入兩個表中的一個(買和ASXCode)一起在下面的SELECT語句:C#SQL更新兩個連接表

findCommand = new SqlCommand("Select Bought.Stockid, Bought.Buyid, Bought.BuyDate, Bought.Number_Bought," + 
    " Bought.Price, Bought.Brokerage, Bought.Number_Bought, Bought.Interest_Rate, Bought.Acc_Interest, " + 
    "Bought.Total_Cost, Bought.BuyNotes, ASXCode.Stock_Code" + 
    " FROM Bought INNER JOIN ASXCode ON Bought.Stockid = ASXCode.Stockid " + 
    " ORDER BY ASXCode.Stock_Code", JKPLConnection); 

然後,我有以下代碼到findTable綁定到不同的文本框:

findAdapter = new SqlDataAdapter(); 
     findAdapter.SelectCommand = findCommand; 
     findTable = new DataTable(); 
     findAdapter.Fill(findTable); 
     txtBuyId.DataBindings.Add("Text", findTable, "Buyid"); 
     cboS.DataBindings.Add("Text", findTable, "Stock_Code"); 
     dateTimePicker4.DataBindings.Add("Text", findTable, "BuyDate"); 
     txtDateS.DataBindings.Add("Text", findTable, "BuyDate"); 
     txtNumBuyS.DataBindings.Add("Text", findTable, "Number_Bought"); 
     txtPriceS.DataBindings.Add("Text", findTable, "Price"); 
     txtBrokerageS.DataBindings.Add("Text", findTable, "Brokerage"); 
     txtRateS.DataBindings.Add("Text", findTable, "Interest_Rate"); 
     txtOpInterestS.DataBindings.Add("Text", findTable, "Acc_Interest"); 
     txtTotalCostS.DataBindings.Add("Text", findTable, "Total_Cost"); 
     findManager = (CurrencyManager)this.BindingContext[findTable]; 

我已經能夠編輯,刪除並添加新的記錄到findTable。

我希望在各種變化已對findTable做的事,是更新與修改數據庫的表買。我不能使用SqlCommandBuilder,因爲「動態SQL生成不支持多個基表」。

從我做了我明白,我需要寫我自己的更新語句來更新表買各種搜索。然而,我對如何撰寫這份聲明感到不知所措。我希望有人能告訴我我該如何做到這一點。

+0

請參閱以下網頁:https://msdn.microsoft.com/en-us/library/ms177523.aspx。只使用Update命令而不使用其他行。 Update命令必須具有唯一指定需要更改的行的where語句。通常你在where語句中使用主索引。 – jdweng

+0

您不需要聯接進行更新。您需要爲每個數據庫表單獨更新,但可以合併爲一個命令。 – jdweng

回答

1

更新很簡單。

UPDATE <tablename> 
    SET <fieldname> = <new value> 
WHERE <filterconditon> 

因此,例如

UPDATE users 
    SET name = 'Hogan' 
WHERE id = 4523 

(如果我的記錄的ID爲4523)

在你的情況下,我希望你將使用boughtid由於庫存數據通常不會編輯。


回覆以下評論。

首先你必須要小心的術語在這裏的,在SQL數據庫的表是不一樣的HTML表格。

我認爲你是「一頭霧水」,因爲這不是一個簡單的操作。您無法使用「changeBuilder」,只需一步步完成 - 您必須自己動手。你必須爲你做它想要更改的每個值 - 例如更新串改價格會是什麼樣子:

"UPDATE Bought 
    SET Price = {newprice}" 
WHERE Buyid = {buyID}" 

傳遞textPriceS和BuyID作爲參數。

您必須發送這個SQL服務器。這只是基於您展示的代碼需要展開的代碼,以包含所有編輯的字段。

+0

對不起,我沒有得到這個。我不想更新數據庫的Bought表中的單個記錄,我想更新(批量)在創建之後對findTable所做的所有更改 - 添加,刪除和編輯。我可以遍歷findTable中的記錄並查看我所做的所有更改,但是,一旦關閉程序,所有這些更改都會丟失,因爲更改的findTable不會更新回數據庫。 – Johnkg

+0

@Johnkg - 看我的更新。可悲的消息是,你必須更新購買表中的個人記錄 - 沒有其他方法可以做到。 – Hogan

0

事實上,你不能那樣做。但是您可以使用所發佈的查詢創建一個VIEW,然後在該視圖上創建一個INSTEAD OF TRIGGER。該觸發器可以使用您可以定義的邏輯將值插入/更新到正確的表中。

UPDATE: 由於您正在加入另一個表,只顯示一列。您還可以將該列作爲您的Bought表上的計算列,這將爲您節省連接和VIEW/TRIGGER工作,並使您能夠以您的代碼現在工作的方式直接在該表上工作。我沒有測試的代碼,所以它可能不開箱的,但它應該給你一個大方向:

ALTER TABLE Bought 
ADD Stock_Code AS (SELECT TOP 1 Stock_Code FROM ASXCode AS SX WHERE SX.Stockid = Stockid) 

但是請注意,如果你的表是足夠大的,這種計算列可真導致嚴重的性能影響,並且使用連接更好。

+0

非常感謝您的澄清,我將不得不重新考慮這一切。從一個表中選擇時,我使用下面的代碼來批量更新所有更改,並試圖模擬此操作。 'SqlCommandBuilder BoughtAdapterCommand = new SqlCommandBuilder(BoughtAdapter);' 012-BoughtAdapter.Update(BoughtTable);> – Johnkg

+0

在這裏你很容易遇到問題。在對象模型和數據庫模型之間集成通常會產生一些設計問題。一個ORM將爲你做所有這些,但會產生其他問題。事實上,您將爲大部分數據對象工作使用ORM,但重要的是要充分了解SQL,因此您可以覆蓋ORM不夠好的區域。並請標記我的帖子作爲答案,如果它幫助你,所以我得到一些互聯網黃金:) –