C# 带外连接的多表查询下如何为SqlDataAdapter编写正确的UpdateCommand
解决方法
SqlCommandBuilder仅支持为单表查询自动生成增删改命令,你使用了多表关联查询,因此必须手动定义UpdateCommand,具体实现如下:
完整实现代码
//加载数据填充到GridView DataTable WszystkieProduktyDlaDanegoSklepu = new DataTable(); SqlDataAdapter sda555123 = new SqlDataAdapter(@" 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 ", conn123); sda555123.Fill(WszystkieProduktyDlaDanegoSklepu); //设置DataTable主键,必须保留 WszystkieProduktyDlaDanegoSklepu.PrimaryKey = new DataColumn[] { WszystkieProduktyDlaDanegoSklepu.Columns["id"] }; //手动定义UpdateCommand,仅更新Products表的两个目标字段 SqlCommand updateCmd = new SqlCommand(@" UPDATE Products SET FlagaWaznosci = @FlagaWaznosci, Notatka = @Notatka WHERE id = @ProductId ", conn123); //配置参数,与DataTable列做映射 //请根据你实际表结构修改SqlDbType和字段长度 updateCmd.Parameters.Add("@FlagaWaznosci", SqlDbType.Bit).SourceColumn = "FlagaWaznosci"; updateCmd.Parameters.Add("@Notatka", SqlDbType.NVarChar, 2000).SourceColumn = "Notatka"; updateCmd.Parameters.Add("@ProductId", SqlDbType.Int).SourceColumn = "id"; //赋值给DataAdapter的UpdateCommand属性 sda555123.UpdateCommand = updateCmd; //执行更新 sda555123.Update(WszystkieProduktyDlaDanegoSklepu);
注意事项
- 请根据你的
Products表实际字段类型调整参数的SqlDbType属性,比如id如果是Guid类型则改为SqlDbType.UniqueIdentifier,Notatka字段长度要和表定义一致 - 不需要再使用
SqlCommandBuilder,相关代码可以直接删除 - 如果需要支持新增、删除操作,可以按照同样的逻辑自定义
InsertCommand和DeleteCommand
内容的提问来源于stack exchange,提问作者Adam Zbudniewek
相关产品推荐
相关产品推荐

