我正在尝试使用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的更新命令吗?
谢谢。
我正在尝试使用SqlDataAdapter更新数据库中的表。我从表中检索模式,它使用列和主键正确填充了DataTable。只有...
这个答案有点晚了,但是看看SqlCommandBuilder.ConflictOption属性。默认值为:CompareAllSearchableValues,这是您看到的行为。如果只想检查主键,请尝试使用OverwriteChanges。