SqlBulkCopy выдает ошибку InvalidOperationException, что я вставляю нулевые значения, но все значения не нулевые в таблице

У меня есть таблица, в которой одним из полей является «InDatabase» (тип «бит» SQL Server), который не допускает нулей.

Я создаю таблицу и добавляю в нее несколько сотен строк, где InDatabase всегда присваивается значение (InDatabase относится к тому, находится ли строка в другой базе данных)

Когда я вызываю SqlBulkCopy, он выдает ошибку InvalidOperationException с сообщением:

"Column 'InDatabase' does not allow DBNull.Value."

Каждая строка создается как таковая:

ProductionDatabaseDataSet.EntriesV2Row NewRow = this.InsertTable.NewEntriesV2Row();

NewRow.MeetEntryID = MeetEntryID;
NewRow.EventID = EventID;
NewRow.MeetID = MeetID;
NewRow.AthleteID = AthleteID;
NewRow.Exhibition = Exhibition;
NewRow.Bonus = Bonus;
NewRow.EnterEvent = true;
NewRow.InDatabase = true;
if (AutoTime != null)
    NewRow.AutoTime = AutoTime ?? -1;
if (CustomTime != null)
    NewRow.CustomTime = CustomTime ?? -1;

this.InsertTable.AddEntriesV2Row(NewRow);

Затем, после того как вышеописанное вызывается около 300 раз, вызывается SqlBulkCopy:

SqlBulkCopy bulkCopy = new SqlBulkCopy(this.Connection.ConnectionString);
bulkCopy.DestinationTableName = this.Adapter.TableMappings[0].DataSetTable;
            bulkCopy.BatchSize = BatchSize;
bulkCopy.WriteToServer(InsertTable); //Throwing the error

Я использую точно такой же формат примерно на дюжине других таблиц без проблем.


person user1004944    schedule 20.10.2011    source источник
comment
InsertTable есть? Это работает на одной строке?   -  person Boomer    schedule 20.10.2011
comment
Нет. Это не работает с одной строкой.   -  person user1004944    schedule 20.10.2011
comment
я подозреваю, что ваш запрос на вставку, так как здесь он выглядит нормально   -  person Boomer    schedule 20.10.2011
comment
Когда я использую обычную вставку, она работает правильно. Использование EntriesV2TableAdapter.Update(InsertTable) также работает корректно.   -  person user1004944    schedule 20.10.2011


Ответы (2)


Хорошо, я заставил это работать, но не совсем понял. Я изменил раздел bulkCopy на это:

bulkCopy.DestinationTableName = this.Adapter.TableMappings[0].DataSetTable;
for (int i = 0; i < this.Adapter.TableMappings[0].ColumnMappings.Count; i++)
    bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(
                this.Adapter.TableMappings[0].ColumnMappings[i].SourceColumn.ToString(),
                this.Adapter.TableMappings[0].ColumnMappings[i].DataSetColumn.ToString()));
bulkCopy.BatchSize = BatchSize;


bulkCopy.WriteToServer(InsertTable);

Не совсем уверен, почему дюжина других раз, когда я делал это, не устанавливая сопоставления таблиц, как это сработало, но по какой-то причине с этой таблицей это не сработает, если я не сделаю вышеописанное.

person user1004944    schedule 22.10.2011

Если я правильно понял вашу проблему...

Я думаю, что проблема заключается в определении значения NULL в c# .net и SQL. Среднее значение NULL вашего языка программирования не будет таким же в SQL. В SQL значение NULL представлено классом System.DBNull.

Просто проверьте, как обрабатывать Null и DBNull

person huMpty duMpty    schedule 20.10.2011
comment
Но имеет ли это значение, поскольку ни одна из записей в этом столбце не является нулевой? - person user1004944; 20.10.2011
comment
Прочитайте сообщение об ошибке: Где-то есть значение null или DBNull. Когда вы создаете строку, откуда берется Bonus? Вы читали это из базы данных? Есть вероятность, что это DBNull. - person ta.speot.is; 20.10.2011
comment
Бонус никогда не равен нулю. Единственными, которые когда-либо будут равны нулю, являются AutoTime и CustomTime. Установка для них значения DBNull не влияет на то, будет ли выброшено исключение. И значения DBNull принимаются в базе данных для этих значений. - person user1004944; 20.10.2011