SqlCommandBuilder, генерирующий неверный оператор обновления - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь использовать 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 Команда?

Спасибо.

1 Ответ

0 голосов
/ 17 февраля 2020

Этот ответ немного запоздал, но взгляните на свойство 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...