Могу ли я добавить блок сценариев SSIS с пользовательским сценарием в панель инструментов?

У меня есть общий блок задач сценария SSIS C#, который мы используем в нашей компании. Это всего лишь один блок скрипта, но скрипт внутри всегда один и тот же. Мы используем его во многих наших пакетах служб SSIS. Немного неприятно всегда копировать блок из другого проекта или откуда-то копировать скрипт в новый блок скрипта.

Можно ли как-то поместить копию этого блока сценария с предварительно написанным сценарием в панель инструментов служб SSIS, чтобы я мог просто перетащить его в наши проекты?

РЕДАКТИРОВАТЬ:

Итак, я начал писать собственный элемент управления на основе приведенного ниже совета. У меня все работает, кроме подключения к моей базе данных SQL Server. Используя следующий код:

SqlConnection SettingsConnection = (SqlConnection)_selectedConnectionManagerSource.AcquireConnection(transaction); // Errors here
SqlCommand sp_GetAllValues = new SqlCommand();
sp_GetAllValues.Connection = SettingsConnection;
sp_GetAllValues.CommandType = CommandType.StoredProcedure;
sp_GetAllValues.CommandText = "Get_My_Data_For_Project";
sp_GetAllValues.Parameters.AddWithValue("@project_name", pkgname);
SettingsConnection.Open();
SqlDataReader SettingsReader = sp_GetAllValues.ExecuteReader();
while (SettingsReader.Read())
{

Я получаю это сообщение об ошибке:

[Connection manager "DevServer"] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "Login timeout expired". An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.". An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 Description: "Named Pipes Provider: Could not open a connection to SQL Server [53]. ".

Что я делаю неправильно?

ДРУГОЕ РЕДАКТИРОВАНИЕ:

Если я изменю код на:

string myConnectionStr = _selectedConnectionManagerSource.ConnectionString;
SqlConnection SettingsConnection = new SqlConnection(myConnectionStr);
SqlCommand sp_GetAllValues = new SqlCommand();
sp_GetAllValues.Connection = SettingsConnection;
sp_GetAllValues.CommandType = CommandType.StoredProcedure;

Я получаю это сообщение об ошибке:

Error: The Execute method on the task returned error code 0x80070057 (Keyword not supported: 'provider'.). The Execute method must succeed, and indicate the result using an "out" parameter.

Если я удалю раздел "провайдер" строки соединения (жесткий код строки):

string myConnectionStr;
myConnectionStr = "Data Source=mydatabase;Initial Catalog=mycatalog;Integrated Security=SSPI;";
SqlConnection SettingsConnection = new SqlConnection(myConnectionStr);
SqlCommand sp_GetAllValues = new SqlCommand();
sp_GetAllValues.Connection = SettingsConnection;
sp_GetAllValues.CommandType = CommandType.StoredProcedure;

Я получаю это сообщение об ошибке:

Error: The Execute method on the task returned error code 0x80131904 (A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)). The Execute method must succeed, and indicate the result using an "out" parameter.

Этот последний блок - именно тот код, который я использовал в своем блоке "Задача сценария", и он работает нормально. Я просто не уверен, какая разница между двумя...:/

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

Все эти сообщения об ошибках были из-за того, что мой тестовый пакет был настроен на работу 64-битной, а не 32-битной. Я изменил пакет на 32-битный, и он начал работать с подключением ADO.NET. Мой окончательный код выглядит так:

string myConnectionStr = _selectedConnectionManagerSource.ConnectionString;
SqlConnection SettingsConnection = new SqlConnection(myConnectionStr);
SqlCommand sp_GetAllValues = new SqlCommand();
sp_GetAllValues.Connection = SettingsConnection;
sp_GetAllValues.CommandType = CommandType.StoredProcedure;

и он прекрасно работает, если он использует источник данных ADO.NET. Он по-прежнему не будет работать с источником данных OleDb, даже используя OleDbConnection и т. Д. Не знаю почему. Но теперь, когда он работает с ADO.NET, я действительно не хочу решать этот вопрос.

Теперь, когда базовая функциональность работает нормально, я собираюсь написать пользовательский интерфейс...:)

2 ответа

Решение

Единственный способ - создать собственное задание: http://microsoft-ssis.blogspot.com/2013/06/create-your-own-custom-task.html введите описание изображения здесьвведите описание изображения здесь

В качестве альтернативы можно создать пользовательскую сборку и ссылку на нее в своей задаче сценария: http://microsoft-ssis.blogspot.com/2011/05/referencing-custom-assembly-inside.html

Поэтому я думаю, что вы столкнулись с проблемой, связанной с поставщиком вашего соединения:

  1. Вы не можете включить ключевое слово провайдера в строку подключения SqlConnection. Все соединения в SSIS являются соединениями OLE DB, которые включают ключевое слово провайдера в строку подключения.

Таким образом, в вашем коде вы должны использовать OleDbConnection вместо SqlConnection (и OleDbCommand, OleDbDataReader и т. Д.)

Для вашей жестко запрограммированной строки соединения случайно встречается ли в имени вашего экземпляра косая черта? Это сбило меня с толку один раз, вы должны избежать косых черт в строках C#, так что если ваша строка подключения

Data Source=SERVER\INSTANCE;Initial Catalog=DatabaseName;Integrated Security=SSPI;

Ваш код C# должен выглядеть так:

string ConnStr = "Data Source=SERVER\\INSTANCE;Initial Catalog=DatabaseName;Integrated Security=SSPI;";

или (мое предпочтение)

string ConnStr = @"Data Source=SERVER\INSTANCE;Initial Catalog=DatabaseName;Integrated Security=SSPI;";
Другие вопросы по тегам