【发布时间】:2020-02-11 15:13:40
【问题描述】:
我正在尝试使用SqlDataAdapter 来更新数据库中的表。
我从表中检索架构,并使用列和主键正确填充DataTable。 DataTable中只有一个约束,是正确的三个PK列。
DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add(tableName);
adapter.SelectCommand = new SqlCommand("select * from " + tableName, connection);
adapter.FillSchema(dt, SchemaType.Source);
// Add datarows
我为适配器创建了一个SqlCommandBuilder,...
SqlCommandBuilder cmdBld = new SqlCommandBuilder(adapter);
...但是它生成的更新命令在WHERE 子句中包含许多不是主键的字段组合。根据我的阅读,构建器应该根据DataTable的PK约束生成更新语句:
UPDATE [MyTable]
SET [CCode] = @p1,
[RefNumber] = @p2,
[BrandId] = @p3,
[BasePrice1] = @p4,
[BasePrice2] = @p5,
....
WHERE
(([CCode] = @p14) -- PK
AND ([RefNumber] = @p15) -- PK
AND ([BrandId] = @p16) -- PK
AND ([BasePrice1] = @p17)
AND ([BasePrice2] = @p18)
AND ((@p19 = 1 AND [AddedBy] IS NULL) OR ([AddedBy] = @p20))
AND ((@p21 = 1 AND [SFlag] IS NULL) OR ([SFlag] = @p22))
AND ((@p23 = 1 AND [CartonCode] IS NULL) OR ([CartonCode] = @p24))
AND ((@p25 = 1 AND [AvailableOrder] IS NULL) OR ([AvailableOrder] = @p26))
AND ((@p27 = 1 AND [AvailableRegistration] IS NULL) OR ([AvailableRegistration] = @p28))
AND ((@p29 = 1 AND [IsFOC] IS NULL) OR ([IsFOC] = @p30))
AND ((@p31 = 1 AND [ItemBrand] IS NULL) OR ([ItemBrand] = @p32))
AND ((@p33 = 1 AND [QuantityMultiply] IS NULL) OR ([QuantityMultiply] = @p34)))
谁能帮我理解为什么我没有收到预期的基于 PK 的更新命令?
谢谢。
【问题讨论】:
-
documentation 声明它使用“乐观并发”方法 - 因此 where 子句试图忽略逻辑上没有任何变化的更新。
-
是的。将其发布为答案,我会接受。谢谢!感谢您编辑@marc_s
标签: c# .net sql-server ado.net