Я пытаюсь использовать 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
, которые не являются первичными ключами. Из того, что я прочитал, сборщик должен сгенерировать оператор обновления на основе ограничения PK для DataTable
:
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 Команда?
Спасибо.