ADO.NET CommandBuilder, InsertCommand и ограничения по умолчанию - PullRequest
4 голосов
/ 03 мая 2011

Я копирую данные из таблицы A в таблицу B. В таблице B есть столбец , обнуляемый , который имеет ограничение по умолчанию значение 0. В общем случае я устанавливаю значения столбцов, используяследующий аксессор.

public object this[string columnName]
{
    get { return DataTable.Rows[CurrentRow][columnName]; }
    set { DataTable.Rows[CurrentRow][columnName] = value; }
}

Но я НЕ устанавливаю обнуляемый столбец X.

Когда я вставляю всю строку, по умолчаниюзначение не используется.Вместо 0 для столбца, допускающего значение NULL, был вставлен NULL.

_sqlCommandBuilder = new SqlCommandBuilder(_sqlDataAdapter);
_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges;
_sqlCommandBuilder.SetAllValues = false;
_sqlDataAdapter.Update(DataTable);

Я также получаю схему:

_sqlDataAdapter.Fill(DataTable);
_sqlDataAdapter.FillSchema(_dataTable, SchemaType.Mapped);

Почему ADO.NET устанавливает NULL для моего столбца X, хотя я это сделалНЕ устанавливаете его?

Я думал, что когда я не устанавливаю значение столбца X, ADO.NET получает значение по умолчанию из данного ограничения.

Может ли ADO.NET CommandBuilder работатьиспользовать ограничения по умолчанию?

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Вам не нужно использовать 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.

0 голосов
/ 08 мая 2011

Небольшой вопрос, это может показаться очевидным, но на самом деле это сложно.

_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges;

Если я цитирую MSDN определение , вы можете прочитать:

"If no PrimaryKey is defined, all searchable columns are included in the WHERE clause."

Мой друг, который использовал для определения ИДЕНТИЧНОСТИ (1, 1) в некоторых камерах вместо первичных ключей.

Так мало вопросов, используете ли вы первичный ключ в вашей "обновленной" таблице B ??



затем ....

Чтобы добавить информацию, SqlAdapter.FillSchema не использует значения по умолчанию. Вот информация, полученная с помощью FillSchema:

AllowDBNull 
AutoIncrement.You must set AutoIncrementStep and AutoIncrementSeed separately.
MaxLength 
ReadOnly 
Unique

(Цитата с MSDN сайта )

Уникальный

...