Вам не нужно использовать CommandBuilder
для реализации метода обновления для DataAdapter
.CommandBuilder
полон проблем.Вы можете установить свойства DataAdapter.SelectCommand
и DataAdapter.UpdateCommand
для DbCommand
объектов, которые указывают sql напрямую.Это позволяет избежать проблем, присущих способности CommandBuilder
генерировать правильные операторы SQL.
Обновление:
CommandBuilder не может знать, что вы хотите использовать значение по умолчанию.Все, что он делает, это генерирует оператор вставки, если есть столбец, он собирается сгенерировать его для оператора вставки.Если этот столбец является частью оператора вставки, то будет вставлено любое значение, заданное для этого столбца, даже нулевое.Значение по умолчанию для ситуаций, когда вы не включаете его в оператор вставки.Он не преобразует значение NULL в значение по умолчанию, независимо от того, как вы пытаетесь вставить элементы, CommandBuilder или нет.
Продолжение этого пути попытки использовать CommandBuilder только даст вам больше горя.Он даже не может обработать простой оператор соединения в своем предложении select.Также требуется первичный ключ.Если какой-либо из них нарушается, он не может генерировать правильные операторы обновления, вставки и удаления.Только два провайдера, Sql Server и Oracle, когда-либо реализовывали этот класс, и известно, что у одного из Oracle есть ошибки, которые никогда не были устранены за пределами основных проблем, упомянутых выше.
Если вы использовали два объекта DbCommand, одиндля выбора и один для вставки, а затем циклически просматривая выходные данные select DbCommand через DbDataReader, вы можете легко проверить наличие нулевого значения в этом столбце и указать нулевое значение по умолчанию для вставки DbCommand, поскольку вы знаете, что это такое.Знание правил базы данных и их использование при необходимости не является нарушением каких-либо правил организации кода.В любом случае, вы должны знать, что находится в базе данных, чтобы написать код такого типа.
Если у вас SQL Server 2005 или более поздней версии, другое предложение заключается в использовании INSERT INTO .. SELECT * 1019.* заявление.Если ваш sql достаточно хорош, вы можете использовать предложение CASE , чтобы сделать один оператор sql.