0

我想要更新 2 个字段:p.FlagaWaznosci 和 p.Notatka

我的选择看起来像:

Select  DISTINCT p.id,p.Model_Number,p.Product_Name,p.Website_Link,p.Entry_date,p.LastUpdate_date,p.PrzydzialRozmiarow_ID,p.FlagaWaznosci,p.Notatka,pr.NazwaRozmiarowki,wd.LINK_StockX 
from Products p with(nolock)
left outer  join Widok_Model_Sklep_Stockx_Linki wd with(nolock) on wd.Product_ID = p.id 
left outer join PrzydzialRozmiarow pr with(nolock) on pr.id = p.PrzydzialRozmiarow_ID 
inner join Shops s with(nolock) on s.ID = p.Shop_ID 

只有外连接来获取我需要在gridview中显示的正确数据。现在,当值 p.FlagaWaznosci 或 p.Notatka 更改时,我想将更新保存在我的数据库中。

我尝试使用

//loads dataand fill to gridview
 DataTable WszystkieProduktyDlaDanegoSklepu;
 SqlDataAdapter sda555123 = new SqlDataAdapter("here is my select", conn123);
 sda555123.Fill(WszystkieProduktyDlaDanegoSklepu);
 
 //later update table Prooducts and save changed on p.Notatka and p.FlagaWaznosci
 cmdbl = new SqlCommandBuilder(sda555123);
 cmdbl.ConflictOption = ConflictOption.OverwriteChanges;
 sda555123.Update(WszystkieProduktyDlaDanegoSklepu);

但是这样我有错误

在此处输入图像描述

于是搜了很多,发现:我得自己写CommandUpdate。

所以......sda555123.UpdateCommand我不知道如何在更新命令中为它编写自己的更新。

SQL Server 中的更新应如下所示:

Update Products
set FlagaWaznosci = @Flagawaznosci from my sda555123,
Notatka = @Notatka from my sda555123 
where id = @ p.ID from my sda555123 

我的命令更新应该看起来像这里吗?

编辑 1:

我尝试添加: WszystkieProduktyDlaDanegoSklepu.PrimaryKey = new DataColumn[] { WszystkieProduktyDlaDanegoSklepu.Columns["id"] } 但没有。还是这个错误。

4

2 回答 2

1

我会通过改变方法而不是改变 SqlDataAdapter 的更新命令来解决这个问题。

鉴于您查询中的 Products.id 在结果集中是唯一的:

1-创建一个临时表(本地或全局),其列与id作为主键的查询结果相同。

2- 使用您的 select 语句将数据插入到临时表中。

3- DataAdatper.selectQuery.commandText 设置为“从 TempTable 中选择 *”

4- 更新命令现在基于一个简单的选择语句,因此 datagridview/datatable 中的任何更改都可以使用 dataadapter.update(datatable) 更新到临时表

5-至于最终的数据库更新,您可以使用以下语句

Update Prd
set Prd.FlagaWaznosci = TempTable.FlagaWaznosci ,Prd.Notatka = TempTable.Notatka  etc.. all the fields that need to be updated  
from my Products as Prd 
Inner Join TempTable on TempTable.id = Prd.id

请注意,(5)中的更新将影响所有行,即使是未更改的行。要解决此问题,您可以执行以下操作

1- 将更改的 ID 保存在列表中。

List<string> lst = new List<string>();
foreach(DataRow dr in datatable.GetChanges(DataRowState.Modified))
{
 lst.add(dr["id"].ToString());
}

2-将您的列表转换为要与 (5) 中的查询连接的字符串值

 String strchange = String.Join(",",lst); //will give you id1,id2,...
 //The update query becomes
 Update Prd
 set Prd.FlagaWaznosci = TempTable.FlagaWaznosci ,Prd.Notatka = 
 TempTable.Notatka  etc.. all the fields that need to be updated  
 from my Products as Prd 
 Inner Join TempTable on TempTable.id = Prd.id
 Where Prd.id In ( strchange ) 
于 2021-11-03T08:46:14.560 回答
0

请分别更新您的表格,因为在加入时您只是将两个或两个以上的表格合并到一个表格中。但你不能对

于 2021-11-03T08:24:37.350 回答