Я занимаюсь преобразованием некоторых процедур отчетности на основе хранимых процедур для запуска на 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)
...
По сути, значение Receipts (Поступления) шло в Orderers (Заказы), и наоборот.
Очевидно, это потому, что SqlBulkCopy, кажется, не почитает название колонки, которую я ему сказал заполнять - она просто идет по порядку.
Это проблема для меня, так как мы используем SQL Compare от Redgate. При перемещении изменений из одной базы данных в другую, порядковая позиция столбцов не обязательно поддерживается. (например, если вы вставляете новый столбец в качестве третьего порядкового поля, SQL Compare просто добавляет его в таблицу на синхронизации, делая ее последним столбцом).
Это серьезно портит мое решение. Теперь это только 'импорт' таблиц, так что при необходимости я могу бросить и воссоздать их как часть любого скрипта переноса с неповрежденными порядковыми позициями. Однако я бы предпочёл этого не делать.
Есть ли способ заставить SqlBulkCopy уважать имена столбцов, которые вы говорите ему заполнить?