Значение было слишком большим или слишком маленьким для Int16 при копировании в таблицу данных - PullRequest
2 голосов
/ 05 января 2012

Q:

Следующий код:

        var dtInstTotal = dtExternal.AsEnumerable()
                    .Union(dtEmployed.AsEnumerable())
                    .OrderBy(d => d.Field<string>("emp_name"));

        dtInst = dtInstTotal.CopyToDataTable();//exception

сгенерировать исключение:

Значение было слишком большим или слишком маленьким для Int16. Не удалось сохранить <103930> в столбце emp_num. Ожидаемый тип - Int16. ---> System.OverflowException: значение было слишком большим или слишком маленьким для Int16.

Ответы [ 2 ]

1 голос
/ 05 января 2012

я думаю, что структура данных в dtInst или dtInstTotal для emp_num равна int16 изменить ее на int32

1 голос
/ 05 января 2012

Я подозреваю, что dtExternal имеет тип short для emp_num, тогда как dtEmployed имеет какой-то другой тип (int, long или, может быть, просто ushort) - или, может быть, наоборот. CopyToDataTable просто использует типы из первой таблицы, содержащей первую строку, которую он видит, и затем возникают проблемы, когда он сталкивается со значением для столбца с таким же именем из другой таблицы. С Документы :

Схема таблицы назначения основана на схеме первой строки DataRow в исходной последовательности. Метаданные таблицы извлекаются из метаданных DataRow, а значения таблиц - из значений столбцов DataRow.

В основном: убедитесь, что две исходные таблицы имеют одинаковую схему.

РЕДАКТИРОВАТЬ: Мы не знаем, как выглядят ваши методы для заполнения двух оригинальных DataTable - но вы можете обнаружить это, создав сначала DataTable, явно указав тип emp_num и тогда заполнение стола, все будет хорошо.

Вы могли бы даже оставить свои оригинальные методы в покое, и построить новую DataTable с правильной схемой, затем вызвать

dtInstTotal.CopyToDataTable(tableWithCorrectSchema, LoadOption.PreserveChanges);
...