Я нахожусь в процессе преобразования некоторых подпрограмм на основе хранимых процедур для запуска в C #. Общая идея состоит в том, чтобы использовать все чудеса C # / .NET Framework, а затем отправить результаты обратно в БД. Все шло гладко, кроме одной проблемы, с которой я столкнулся вчера и решил сегодня.
Чтобы выполнить импорт, я программно создаю DataTable и использую SqlBulkCopy для перемещения результатов на сервер.
, например
DataTable detail = new DataTable();
detail.Columns.Add(new DataColumn("Stock", Type.GetType("System.Decimal")));
detail.Columns.Add(new DataColumn("Receipts", Type.GetType("System.Decimal")));
detail.Columns.Add(new DataColumn("Orders", Type.GetType("System.Decimal")));
В таблице импорта были поля в следующем порядке.
...
Stock decimal(18,4),
Orders decimal(18,4),
Receipts decimal(18,4)
...
По сути, значение для поступлений переходило в заказы, и наоборот.
Очевидно, это потому, что SqlBulkCopy, похоже, не выполняет имя столбца, который я сказал ему заполнить - он просто идет по порядковому положению.
Это проблема для меня, так как мы используем Red Compare в SQL Compare. При перемещении изменений из одной базы данных в другую, порядковый номер столбцов не обязательно поддерживается. (например, если вы вставите новый столбец в качестве третьего порядкового поля, SQL Compare просто добавит его в таблицу при синхронизации, сделав его последним столбцом).
Это серьезно мешает моему решению. Теперь это только таблицы импорта, поэтому при необходимости я могу удалить их и создать заново как часть любого сценария миграции с неизменными порядковыми позициями. Я бы предпочел этого не делать.
Есть ли способ заставить SqlBulkCopy учитывать имена столбцов, которые вы указали заполнить?