【问题标题】:SqlCommandBuilder generating incorrect update statementSqlCommandBuilder 生成不正确的更新语句
【发布时间】:2020-02-11 15:13:40
【问题描述】:

我正在尝试使用SqlDataAdapter 来更新数据库中的表。

我从表中检索架构,并使用列和主键正确填充DataTableDataTable中只有一个约束,是正确的三个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


【解决方案1】:

这个答案有点晚了,但是看看 SqlCommandBuilder.ConflictOption 属性。默认值为:CompareAllSearchableValues,这是您看到的行为。如果您只想检查主键,请尝试使用 OverwriteChanges。

例如

SqlCommandBuilder cmdBld = new SqlCommandBuilder(adapter);
cmdBld.ConflictOption = ConflictOption.OverwriteChanges; 

ConflictOption 枚举参考: https://docs.microsoft.com/en-us/dotnet/api/system.data.conflictoption?view=netframework-4.8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多