SqlCommandBuilder生成不正确的更新语句

问题描述 投票:0回答:1

我正在尝试使用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的更新命令吗?

谢谢。

我正在尝试使用SqlDataAdapter更新数据库中的表。我从表中检索模式,它使用列和主键正确填充了DataTable。只有...

c# .net sql-server ado.net
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.