2015-09-27 74 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不够好的区域。并请标记我的帖子作为答案,如果它帮助你,所以我得到一些互联网黄金:) –