Почему SSIS не может создать эту задачу? - PullRequest
0 голосов
/ 14 июля 2011

Я написал этот код для реализации задачи потока управления служб SSIS, которая извлекает файл по HTTP:

using System;
using Microsoft.SqlServer.Dts.Runtime;

namespace HttpTask
{
    [DtsTask(
        DisplayName = "HTTP Task",
        TaskContact = "Iain Elder",
        RequiredProductLevel = DTSProductLevel.None
    )]
    public class HttpTask : Task
    {
        public string LocalPath {get; set;}
        public string Connection {get; set;}
        public bool OverwriteDestination {get; set;}

        public DTSExecResult Execute(Connections connections,
            VariableDispenser dispenser, IDTSComponentEvents events,
            IDTSLogging log, object transaction)
        {
            HttpClientConnection http = AcquireHttpConnection(connections);
            http.DownloadFile(this.LocalPath, this.OverwriteDestination);
            return DTSExecResult.Success;
        }

        private HttpClientConnection AcquireHttpConnection(Connections connections)
        {
            ConnectionManager cm = connections[this.Connection];
            object nativeConnection = cm.AcquireConnection(null);
            return new HttpClientConnection(nativeConnection);
        }
    }
}

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

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil.exe" /if "$(TargetPath)"
copy $(TargetFileName) "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks"

При использовании Business Intelligence Development Studio я вижу задачу в наборе инструментов:

HTTPTask is visible in the toolbox.

Когда я перетаскиваю задачув окне дизайна я вижу эту ошибку:

The task fails to create.

Задача не отображается на холсте дизайна.

Что я здесь не так сделал?

РЕДАКТИРОВАТЬ: Шива предложил мне подписать сборку под строгим именем.Я выполнил шаги 1 и 2 руководства по подписанию сборок в блоге Бенни Остина .Я не выполнил другие шаги, потому что мой сценарий после сборки развертывает для меня компонент.

В свойствах проекта Visual Studio я перехожу на вкладку Подписи и создаю новый файл ключа строгого имени для сборки.:

enter image description here

Я сохраняю настройки и перестраиваю пакет.Сценарий после сборки развертывает новый пакет.

Я все еще получаю точно такую ​​же ошибку.

1 Ответ

4 голосов
/ 14 июля 2011

Мне удалось воссоздать проблему, с которой вы столкнулись.В следующем примере описывается, как воссоздать проблему, а также как ее исправить.Я использовал Visual Studio 2010 для создания DLL библиотеки классов, но целевой версией фреймворка была 2.0.Затем задача «Поток управления» была добавлена ​​в проект SSIS 2008 R2, который более или менее совпадает с SSIS 2008.

Пошаговый процесс:

  1. В Visual Studio 2010 IDE создал проект библиотеки классов C # и назвал его HttpTask .Смотрите скриншот # 1 .Удалил все ссылки, кроме обязательных.Добавлена ​​ссылка на DLL Microsoft.SQLServer.ManagedDTS , которая была доступна по пути c:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll на моей машине.Путь может отличаться в зависимости от установленной версии SQL Server.Значение 100 в пути представляет собой SQL Server 2008 или SQL Server 2008 R2.

  2. Переименовал класс Program.cs в HttpTask.cs и вставил код, показанный на снимке экрана # 2 .Код точно такой же, как приведенный в вопросе.Код также предоставляется в разделе C # Код класса .

  3. В свойствах проекта библиотеки классов изменили целевую версию платформы на .NET Framework 2.0.Смотрите скриншот # 3 .

  4. Настроил командную строку события после сборки, как показано на скриншотах # 4 и # 5 .Путь gacutil.exe на моей машине был C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe.Путь может быть другим в вашей машине.Также предоставляется сценарий Командная строка события после сборки section.

  5. Библиотека классов не была подписана в это время.Смотрите скриншот # 6 .

  6. Проект был построен, но DLL не была зарегистрирована в GAC (Global Assembly Cache).См. Снимок экрана # 7 .

  7. Проверено, что DLL была правильно скопирована в путь C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\.См. Снимок экрана # 8 .

  8. Проверено, что DLL не присутствует в папке GAC C:\windows\assembly.См. Скриншот # 9 .

  9. Создан новый пакет служб SSIS.На панели инструментов вкладки Control Flow пакета служб SSIS щелкните правой кнопкой мыши раздел Control Flow Items и выберите Choose Items....См. Снимок экрана # 10 .

  10. На вкладке Выбор элементов панели инструментов выберите вкладку SSIS Control Flow Items и выберите элемент управления Задача HTTP .См. Снимок экрана * 11 .

  11. Попытка перетащить задачу на вкладку Поток управления и получила ту же ошибку, что и в вопросе.Смотрите скриншот # 12 .Таким образом, вышеописанные шаги описали, как смоделировать проблему.Теперь, следующие шаги описывают, как это исправить.

  12. Теперь я вернулся к проекту библиотеки классов и нажал на Свойства.На этот раз я подписал проект с ключом строгого имени.Смотрите скриншот # 13 .

  13. Проверено, что файл ключа строгого имени был добавлен в проект.Смотрите скриншот # 14 .

  14. Построен проект.На этот раз DLL была успешно добавлена ​​в GAC.См. Снимок экрана # 15 .

  15. Проверено, что DLL была правильно скопирована в путь C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\.См. Снимок экрана # 8 .

  16. Проверено, что DLL присутствовала в папке GAC C:\windows\assembly.См. Снимок экрана # 16 .

  17. В пакете служб SSIS удалили контрольную задачу HTTP из раздела Элементы потока управления на панели инструментов.Смотрите скриншот # 17 .

  18. Повторите шаги # 9 и # 10 , чтобы снова добавить задачу внабор инструментов.

  19. Перетащите задачу на вкладку Поток управления, и задача отобразилась правильно.На этот раз ошибок не было.Смотрите скриншот # 18 .

Надеюсь, это поможет.

C # Код класса:

using Microsoft.SqlServer.Dts.Runtime;

namespace HttpTask
{
    [DtsTask(
        DisplayName = "HTTP Task",
        TaskContact = "Iain Elder",
        RequiredProductLevel = DTSProductLevel.None
    )]
    public class HttpTask : Task
    {
        public string LocalPath { get; set; }
        public string Connection { get; set; }
        public bool OverwriteDestination { get; set; }

        public DTSExecResult Execute(Connections connections,
            VariableDispenser dispenser, IDTSComponentEvents events,
            IDTSLogging log, object transaction)
        {
            HttpClientConnection http = AcquireHttpConnection(connections);
            http.DownloadFile(this.LocalPath, this.OverwriteDestination);
            return DTSExecResult.Success;
        }

        private HttpClientConnection AcquireHttpConnection(Connections connections)
        {
            ConnectionManager cm = connections[this.Connection];
            object nativeConnection = cm.AcquireConnection(null);
            return new HttpClientConnection(nativeConnection);
        }
    }
}

Командная строка события после сборки:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe" 
/if "$(TargetPath)"
copy $(TargetFileName) 
"C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\"

Скриншот №1:

1

Скриншот № 2:

2

Скриншот № 3:

3

Снимок экрана № 4:

4

Скриншот № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Снимок экрана № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

Скриншот № 11:

11

Снимок экрана № 12:

12

Снимок экрана № 13:

13

Снимок экрана № 14:

14

Снимок экрана № 15:

15

Снимок экрана № 16:

16

Снимок экрана № 17:

17

Снимок экрана № 18:

18

...