Приветствую!
Есть задачка по импорту ряда справочников формата DBF в MS SQL Server 2008 из приложения на C#. Ситуация осложняется тем, что я могу делать импорт данных только через хранимые процедуры на сервере, так как у самого приложения может не быть прав на прямую работу с таблицами, в которые нужно добавлять данные. Потому, например, System.Data.SqlClient.SqlBulkCopy
не очень-то подходит, как и прямые запросы через SqlCommand
. Сразу скажу, что есть ограничение и на команду EXEC
на сервере, т.е. динамические запросы не взлетят.
Сейчас имеется порядка 12 файлов XML, в которых лежат сконвертированные из DBF данные, это — источник. В качестве приемника используются 12 таблиц в БД MS SQL.
При этом структуры таблиц-источников и таблиц-приемников не совпадают (типы, названия полей). Обусловлено это тем, что в XML данные хранятся без явного указания типа (да, можно было бы делать схему в XSD но это не нужно, т.к. в оригинальных файлах, например, значения типа int
сплошь и рядом хранятся в char
, т.е. в источнике поле имеет тип char
, в приемнике должно быть int
).
Имена полей не совпадают по причине того, что они просто криво были названы в DBF, и в MS SQL переносить это не хотелось (например, название города в справочнике хранится в поле с названием I_GOR, в SQL БД - это же поле названо как Name).
Зато вот число полей любой таблицы-источника совпадает с числом полей аналогичной таблицы-приемника.
Потому, решение видится в качестве одной хранимой процедуры, пусть 'sp_ImportXMLDictionary', которой бы на вход в качестве параметров подавались бы: имя таблицы, в которую нужно импортировать и XML-файл, который нужно импортировать. Процедура брала бы данные из каждой колонки XML, и просто бы вставляла в целевую таблицу в колонку с тем же порядковым номером.
Пример:
Изначально DBF содержит поля с данными:
COD_RS (char), GOR (char), I_GOR (char)
55 000 Нью-Васюки
56 002 Гадюкино
56 007 Васюки
То после обработки получаем на выходе следующий набор полей (c данными) в XML
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<SPRGOR>
<ID>1</ID>
<COD_RS>55</COD_RS>
<GOR>000</GOR>
<I_GOR>Нью Васюки</I_GOR>
</SPRGOR>
<SPRGOR>
<ID>2</ID>
<COD_RS>56</COD_RS>
<GOR>002</GOR>
<I_GOR>Гадюкино</I_GOR>
</SPRGOR>
<SPRGOR>
<ID>3</ID>
<COD_RS>56</COD_RS>
<GOR>007</GOR>
<I_GOR>Васюки</I_GOR>
</SPRGOR>
</DocumentElement>
Целевая таблица имеет структуру:
ID (int, identity, PK), AreaCode (int), CityCode (int), Name (nvarchar(50))
В идеале хотелось бы сделать так, что бы первое поле из XML попадало в первое поле таблицы (ID ---> ID), второе из XML - в второе поле таблицы (COD_RS ---> AreaCode) и так далее, по числу полей. И да, с конвертацией данных при вставке в тип данных, указанных в приёмнике.
Ваше мнение, как лучше разрешить эту задачку? Возможно, кто-то сталкивался с подобным?
Всё, что я видел пока, это вставка данных в таблицу либо с учетом структуры таблиц, либо предлагается использовать мастер для импорта (с маппингом полей и типов), но использование мастеров не подходит изначально, а привязываться к структуре каждой из таблиц-источников и писать для каждой из них свою хранимку не очень хотелось бы (точнее, очень не хотелось бы).
(Генерацию XML я уже сделал, проблема в последующей загрузке этих данных на сервер)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Написал код для тестирования работы PageMethods в Javascript и C#,но в скрипте не видит PageMethodsЭто скрипт`
В главном окне есть кнопка, при нажатии на которую должен вызваться метод , который есть в UserControl
Есть ViewPager, каким методом можно узнать отклонение от центра страницы? То есть если страница неподвижно стоит в центре, то отклонение 0Если...