C#SQL更新两个连接表中的一个

时间:2015-09-27 04:27:58

标签: c# sql-server

我在以下select语句中加入了两个表(Bought和ASXCode):

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进行各种更改时,我想要做的是使用更改更新数据库的Bought表。我不能使用SqlCommandBuilder,因为“多个基表不支持动态SQL生成”。

我从各种搜索中了解到我需要编写自己的更新语句来更新Bought表。但是,我对如何撰写本声明感到茫然。我希望有人能告诉我如何做到这一点,拜托。

2 个答案:

答案 0 :(得分:1)

更新很简单。

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

所以例如

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

(如果我的记录的ID是4523)

在你的情况下,我希望你会使用boughtid,因为股票数据通常是不可编辑的。

回复以下评论。

首先,您必须注意这里的术语,SQL DB中的表与HTML中的表不同。

我认为你很困惑&#34;因为这不是一个简单的操作。你不能使用&#34; changeBuilder&#34;什么是这样,一步到位 - 你必须自己做。您必须为要更改的每个值执行此操作 - 例如,更改价格的更新字符串将如下所示:

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

将textPriceS和BuyID作为参数传递。

您将把此sql发送到服务器。这只是您想要的示例,您需要展示的代码需要扩展以包含所有要编辑的字段。

答案 1 :(得分:0)

事实上,你不能这样做。但是您可以使用您发布的查询创建VIEW,然后在该视图上创建INSTEAD OF TRIGGER。该触发器可以使用您可以定义的逻辑将值插入/更新到正确的表中。

<强>更新: 由于您要连接另一个表以仅显示一列。您还可以在Bought表上将该列作为计算列,这将为您节省连接和VIEW / TRIGGER工作,并使您能够以您的代码现在的工作方式直接在该表上工作。我还没有对该代码进行测试,因此它可能无法开箱即用,但它应该为您提供一个大方向:

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

但请注意,如果您的表足够大,此计算列确实会对性能造成严重影响,并且使用连接会好得多。