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