Объявлять деструкторы виртуальными в полиморфных базовых классах. Это пункт 7 в «Эффективном C ++» Скотта Майерса . Мейерс продолжает обобщать, что если класс имеет любую виртуальную функцию, он должен иметь виртуальный деструктор, а классы, не предназначенные для базовых классов или не предназначенные для использования полиморфно, должны не объявить виртуальные деструкторы.
Ошибка The given ColumnMapping does not match up with any column in the source or destination
обычно возникает по 3 причинам:
В вашем случае вы не указали отображение столбцов. Вот онлайн пример, похожий на ваш сценарий: https://dotnetfiddle.net/WaeUi9
Чтобы исправить это:
Например: https://dotnetfiddle.net/Zry2tb
Дополнительную информацию об этой ошибке можно найти здесь: https: // sqlbulkcopy-tutorial .net / columnmapping-это-не-матч
Если вы можете читать данные в таблице данных, измените свой код, как показано ниже
bulkCopy.DestinationTableName = "dbo.Student";
bulkCopy.ColumnMappings.Add("<list field name>", "<database field name>");
//Map all your column as above
bulkCopy.WriteToServer(dataTable);
Я надеюсь, что это поможет вашей проблеме.
Используйте 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 ничего не нужно кэшировать