我在以下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表。但是,我对如何撰写本声明感到茫然。我希望有人能告诉我如何做到这一点,拜托。
答案 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)
但请注意,如果您的表足够大,此计算列确实会对性能造成严重影响,并且使用连接会好得多。