Невозможно преобразовать список, содержащий несколько классов в DataTable

3 ответа

Ошибка The given ColumnMapping does not match up with any column in the source or destination

обычно возникает по 3 причинам:

  • Вы не предоставили никаких ColumnMappings, и в источнике больше столбцов, чем в месте назначения.
  • Вы указали неверное имя столбца для источника.
  • Вы указали неверное имя столбца для получателя.

В вашем случае вы не указали отображение столбцов. Вот онлайн пример, похожий на ваш сценарий: https://dotnetfiddle.net/WaeUi9

Чтобы исправить это:

  • Предоставьте ColumnMappings

Например: https://dotnetfiddle.net/Zry2tb

Дополнительную информацию об этой ошибке можно найти здесь: https: // sqlbulkcopy-tutorial .net / columnmapping-это-не-матч

0
ответ дан Muhammad Waqas 6 March 2019 в 15:32
поделиться

Если вы можете читать данные в таблице данных, измените свой код, как показано ниже

bulkCopy.DestinationTableName = "dbo.Student";
bulkCopy.ColumnMappings.Add("<list field name>", "<database field name>");
//Map all your column as above
bulkCopy.WriteToServer(dataTable);

Я надеюсь, что это поможет вашей проблеме.

0
ответ дан dmegha 6 March 2019 в 15:32
поделиться

Используйте ObjectReader FastMember для создания IDataReader поверх любой коллекции, например:

var student = new List<Student>();
...
using(var bcp = new SqlBulkCopy(connection)) 
using(var reader = ObjectReader.Create(student, "Id", "Name", "Email","PhoneNumber")) 
{ 
    bcp.DestinationTableName = "SomeTable"; 
    bcp.WriteToServer(reader); 
}

SqlBulkCopy может использовать либо DataTable, либо IDataReader. ObjectReader.Create создает объект, который оборачивает любую коллекцию и предоставляет его через интерфейс IDataReader, который можно использовать с SqlBulkCopy.

Также можно использовать методы расширения Linq-to-Dataset CopyToDataTable или MoreLinq ToDataTable для создания DataTable из IEnumerable. Они должны будут прочитать весь IEnumerable и кэшировать все данные в DataTable. Это может быть дорого, если есть много строк.

С другой стороны, ObjectReader ничего не нужно кэшировать

0
ответ дан Panagiotis Kanavos 6 March 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: