Загрузчик данных по сценарию
Требуется написать загрузчик данных из нескольких ODBC-источников в приемник (MSSQL) согласно сценарию.
Требования к используемым технологиям:
- .Net Framework 4.5
- ADO.NET
- MS SQL Server
- Для работы с приемником использовать SqlConnection, SqlCommand, SqlTableAdapter
- Для работы с источниками использовать OleDbConnection, OleDbCommand, OleDbTableAdapter
Загрузчик должен представлять собой консольное приложение, запускаемое из командной строки.
В папке с загрузчиком будет находиться xml-файл scenario.xml с описанием сценария загрузки.
Файл будет иметь следующую структуру:
Data Source=.;Initial Catalog=Report;Integrated Security=True
exec spTansformAndLoadTables
select max(callstart) from calls
Dsn=Odbc1;uid=user;pwd=password
select * from calls where callstart > ? order by callstart
select max(callstart) from calls
Dsn=Odbc2;uid=user;pwd=password
select * from calls where callstart > ? order by callstart
...
...
Ниже описан пошагово алгоритм работы загрузчика:
1. Из секции destination взять строку соединения с приемником connectionString. Далее она будет использоваться везде при соединении с приемником.
2. Последовательно из секции tables перебираем все подсекции table. Для каждой table делаем следующие шаги:
3. Берем имя таблицы из атрибута Name и посылаем запрос 'truncate Name' в приемник (например, 'truncate table Odbc1_calls')
4. Берем запрос из тега destinationLastRecordQuery и посылаем в приемник, в ответ получаем дату/время
5. Полученную дату/время подставляем в параметр запроса из тега sourceQuery и получаем данные из источника, используя строку конекта sourceConnectionString.
Учтите, что дату/время необходимо подставлять в запрос не путем конкатентации строк, а с помощью передачи параметров в объект класса OleDbCommand
6. Далее формируем текст запроса для вставки строк, полученных из источника, в приемник.
За один запрос может быть вставлено не более чем количество записей, заданное в атрибуте BatchSize.
Будет гарантировано, что в приемнике таблица уже существует и ее структура полностью соответствует структуре таблицы из источника.
Будет гарантировано что в источнике типы полей могут быть только int, DateTime, string
7. При успешном окончании обработки всей секции tables в приемник посылаем запрос из тега postloadQuery