ranio Ответов: 1

Как создать пакет SSIS динамически и вызвать его в C#?


Я создал пакет вручную и установил образец исходного назначения, сопоставленный, скажем, из файла excel с целевой базой данных, вызвал его программно и сохранил то же самое.

Но мне нужно установить исходный пакет сопоставления назначения для файлов с настроенными подпапками родительской папки и там после динамического вызова его. Таким образом, цель состоит в том, чтобы сохранить записи каждого файла с соответствующими папками в Sql, вызывающий динамически созданный пакет.

Что я уже пробовал:

Мой код выглядит следующим образом:
string strSourceConn = @"C:\Users\employee.txt";
            string strDestConn = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString();

            string pkgLocation = @"D:\SSIS\Test\Integration Services Project1\Integration Services Project1\Package.dtsx";


            Package pkg;
            Microsoft.SqlServer.Dts.Runtime.Application app;
            DTSExecResult pkgResults;

            app = new Microsoft.SqlServer.Dts.Runtime.Application();
            pkg = app.LoadPackage(pkgLocation, null);
            
            //pkg.Variables["strSourceFile"].Value = strSourceConn;
            //pkg.Variables["DestinationFilePath"].Value = strDestConn; 
            
           // pkgResults = pkg.Execute();
            Variables vars;
            vars = pkg.Variables;
            vars["strSourceFile"].Value = strSourceConn;
            vars["DestinationFilePath"].Value = strDestConn;
            pkgResults = pkg.Execute(null, vars, null, null, null);
            //Response.Write(pkg.ExecutionResult);
            Response.Write("<script LANGUAGE='JavaScript' >alert('Saved Successfully')</script>");

1 Ответов

Рейтинг:
2

#realJSOP

Лично я бы так не поступил.

Во-первых, я бы создал папку на сетевом ресурсе для хранения файлов и всегда копировал их туда.

Затем я напишу пакет импортера для каждого отдельного файла. Этот пакет может быть жестко привязан к исходному файлу и целевой базе данных, что устраняет необходимость поддерживать любые переменные пакета, необходимые для этой цели. Это не позволяет одному импортеру влиять на все остальные, если он по какой-то причине выходит из строя.

Если вы настаиваете на запуске пакетов вручную, вы можете создать в своем коде какой-то объект управления для их запуска. Однако я лично заставил бы их работать по расписанию каждые 10-15 минут (если только файлы не обновляются таким образом, который вы еще не разглашали.

Весь этот механизм было бы легче реализовать и поддерживать. Просто говорю...


ranio

Мне удалось создать пакет вручную для образца текстового файла.
Но то, что мне нужно, - это перебирать файлы в подпапках родительской папки и сохранять записи в каждом файле массово, вызывая созданный динамический пакет.

http://www.sqlservercentral.com/blogs/on-the-fringe/2013/08/25/creating-and-executing-an-ssis-package-programmatically/

#realJSOP

Может быть, вы не знаете, как перебирать файлы в папке?

ranio

Это вполне возможно. Попробую с несколькими образцами файлов и посмотреть, и обновить.
Как уже упоминалось, просто повторите файлы в подпапке родительской папки и примените для каждого цикла и передайте файлы, как в коде, сделанном мной
строка strSourceConn = @"C:\Users\employee.txt";
строка strDestConn = System.Конфигурация.Конфигурационный менеджер.ConnectionStrings["ConnectionString"].Параметр connectionString.Метод toString();

строка pkgLocation = @"D:\SSIS\Test\Integration сервисы Project1\Integration Services Project1\Package.dtsx";


Упаковка pkg;
Майкрософт.От SQLServer.ДЦ.Во время выполнения.Приложение приложение ;
DTSExecResult pkgResults;

приложение = новый Microsoft.От SQLServer.ДЦ.Во время выполнения.Приложение();
ПКГ = приложение.Метода loadpackage(pkgLocation, нуль);

//pkg.Variables["strSourceFile"].Значение = strSourceConn;
//pkg.Variables["DestinationFilePath"].Value = strDestConn;

// pkgResults = pkg.Выполнять();
Переменные vars;
ВАР = УП.Переменные;
vars["strSourceFile"].Значение = strSourceConn;
vars["DestinationFilePath"].Value = strDestConn;
pkgResults = УП.Execute(null, vars, null, null, null);
//Ответ.Писать(УП.ExecutionResult);
Ответ.Писать("предупреждение('успешно сохранен')");

ranio

Я могу сопоставить источник и назначение с таблицей в Sql Server в пакете. Но мне нужно динамически изменять исходный путь . При вызове пакета путь, установленный вручную, работает вместо исходного пути динамически.

Основной код выглядит следующим образом

пробовать
{

Приложение App = новое приложение();



Пакет package = null;

package = app.LoadPackage(@"D:\SSIS\Test3\Integration Services Project1\Integration Services Project1\Package.dtsx", null);

// Добавить диспетчер подключения к пакетам, типа, установка
var file = @"D:\SSIS\Test3\employee11.txt";//набор исходных путей
var connMgrFlatFile = пакет.Подключений.Добавить("установка");

connMgrFlatFile.ConnectionString = файл;
connMgrFlatFile.Name = "Мое Подключение К Файлу Импорта";
connMgrFlatFile.Описание = "Подключение Плоского Файла";


// Настройка столбцов и их свойств для диспетчера соединений с плоскими файлами
var connMgrFlatFileInnerObj = (обертка.IDTSConnectionManagerFlatFile100)connMgrFlatFile.InnerObject;

connMgrFlatFileInnerObj.RowDelimiter = "\r\n";
connMgrFlatFileInnerObj.ColumnNamesInFirstDataRow = false;



/Пакет /Казнить

Майкрософт.От SQLServer.ДЦ.Во время выполнения.DTSExecResult results = пакет.Выполнять();



если (результат == Майкрософт.От SQLServer.ДЦ.Во время выполнения.DTSExecResult.Неудача)
{

по каждому элементу (Майкрософт.От SQLServer.ДЦ.Во время выполнения.DtsError local_DtsError в пакете.Ошибки)
{



Приставка.WriteLine("результаты выполнения пакета: {0}", local_DtsError.Описание.Метод toString());

Приставка.метод WriteLine();

}

}

Ответ.Писать("предупреждение('успешно сохранен')");

}

catch (DtsException ex)
{

// Исключение = ех.Сообщение;

}
}