Как исправить неисправную задачу для задачи сценария служб SSIS, созданной Biml: такой интерфейс не поддерживается - PullRequest
2 голосов
/ 03 апреля 2019

Я тестировал создание задач сценариев с помощью Biml для пакетов служб SSIS. Я хочу иметь возможность локально выполнять / тестировать пакеты успешно.

Мне не удалось выполнить пакеты для проекта из моей локальной среды разработки, поскольку все они выдают ошибку с той же ошибкой, приведенной ниже.

Проблема: Error: 0x0 at ScriptTask 1, Script Task : Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSVariables100'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{2CD38B23-6C17-4025-A8B6-D2E497DD1DDC}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)). at Microsoft.SqlServer.Dts.Runtime.Variables.get_Item(Object index) at ScriptMain.Main() Error: 0x6 at ScriptTask 1: The script returned a failure result. Task failed: ScriptTask 1

Мне удалось успешно выполнить эти пакеты с другого сервера после выполнения развертывания проекта из Visual Studio в каталог служб SSIS (SSISDB) на этом сервере (SQL Server 2016).

Я использовал следующие ссылки для AssemblyInfo и ScriptMain:

<Script ProjectCoreName="ST_232fecafb70a4e8a904cc21f8870eed0" Name="ScriptTask 1">
    <ScriptTaskProject>
        <ScriptTaskProject ProjectCoreName="ST_c41ad4bf47544c49ad46f4440163feae" Name="TaskScriptProject1">
            <AssemblyReferences>
                <AssemblyReference AssemblyPath="Microsoft.SqlServer.ManagedDTS.dll" />
                <AssemblyReference AssemblyPath="Microsoft.SqlServer.ScriptTask.dll" />
                <AssemblyReference AssemblyPath="System.dll" />
                <AssemblyReference AssemblyPath="System.AddIn.dll" />
                <AssemblyReference AssemblyPath="System.Data.dll" />
                <AssemblyReference AssemblyPath="System.Windows.Forms.dll" />
                <AssemblyReference AssemblyPath="System.Xml.dll" />
            </AssemblyReferences>
            <Files>
                <File Path="AssemblyInfo.cs">
                    using System.Reflection;
                    using System.Runtime.CompilerServices;

                    //
                    // General Information about an assembly is controlled through the following
                    // set of attributes. Change these attribute values to modify the information
                    // associated with an assembly.
                    //
                    [assembly: AssemblyTitle("ST_c41ad4bf47544c49ad46f4440163feae.csproj")]
                    [assembly: AssemblyDescription("")]
                    [assembly: AssemblyConfiguration("")]
                    [assembly: AssemblyCompany("Varigence")]
                    [assembly: AssemblyProduct("ST_c41ad4bf47544c49ad46f4440163feae.csproj")]
                    [assembly: AssemblyCopyright("Copyright @ Varigence 2013")]
                    [assembly: AssemblyTrademark("")]
                    [assembly: AssemblyCulture("")]
                    //
                    // Version information for an assembly consists of the following four values:
                    //
                    //      Major Version
                    //      Minor Version
                    //      Build Number
                    //      Revision
                    //
                    // You can specify all the values or you can default the Revision and Build Numbers
                    // by using the '*' as shown below:

                    [assembly: AssemblyVersion("1.0.*")]
                </File>
                <File Path="ScriptMain.cs">
                    using System;
                    using System.Data;
                    using Microsoft.SqlServer.Dts.Runtime;
                    using System.Windows.Forms;

                    // if SSIS2012, use the following line:
                    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]

                    // if earlier version, use the next line instead of the above line:
                    // [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
                    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
                    {
                        enum ScriptResults
                        {
                            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
                            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
                        };

                        public void Main()
                        {
                            try
                            {
                                int totalInsertedRowsToDestination = (int)Dts.Variables["User::TotalInsertedRowsToDestination"].Value;
                                int rowCountNew = (int)Dts.Variables["User::RowCountNew"].Value;
                                int totalUpdatedRowsToDestination = (int)Dts.Variables["User::TotalUpdatedRowsToDestination"].Value;
                                int rowCountChanged = (int)Dts.Variables["User::RowCountChanged"].Value;
                                int totalUnChangedRowsToDestination = (int)Dts.Variables["User::TotalUnChangedRowsToDestination"].Value;
                                int rowCountUnchanged = (int)Dts.Variables["User::RowCountUnchanged"].Value;

                                totalInsertedRowsToDestination += rowCountNew;
                                totalUpdatedRowsToDestination += rowCountChanged;
                                totalUnChangedRowsToDestination += rowCountUnchanged;

                                Dts.Variables["User::TotalInsertedRowsToDestination"].Value = totalInsertedRowsToDestination;
                                Dts.Variables["User::TotalUpdatedRowsToDestination"].Value = totalUpdatedRowsToDestination;
                                Dts.Variables["User::TotalUnChangedRowsToDestination"].Value = totalUnChangedRowsToDestination;

                                Dts.TaskResult = (int)ScriptResults.Success;
                            }
                            catch (Exception ex)
                            {
                                Dts.Events.FireError(0, "Script Task ", ex.Message + "\r" + ex.StackTrace, String.Empty, 0);
                                Dts.TaskResult = (int)ScriptResults.Failure;
                            }
                        }                                   
                    }
                </File>
            </Files>
            <ReadOnlyVariables>
                <Variable Namespace="User" DataType="Int32" VariableName="RowCountNew" />
                <Variable Namespace="User" DataType="Int32" VariableName="RowCountChanged" />
                <Variable Namespace="User" DataType="Int32" VariableName="RowCountUnchanged" />
            </ReadOnlyVariables>
            <ReadWriteVariables>
                <Variable Namespace="User" DataType="Int32" VariableName="TotalInsertedRowsToDestination" />
                <Variable Namespace="User" DataType="Int32" VariableName="TotalUpdatedRowsToDestination" />
                <Variable Namespace="User" DataType="Int32" VariableName="TotalUnChangedRowsToDestination" />
            </ReadWriteVariables>
        </ScriptTaskProject>
    </ScriptTaskProject>
    <PrecedenceConstraints>
        <Inputs>
          <Input OutputPathName="SQL Update <#=dstTableName#>.Output" />
        </Inputs>
    </PrecedenceConstraints>
</Script>

Я ожидаю, что результат будет: SSIS package finished: Success без ошибок в задании сценария.

Мое окружение:

  • Windows 10 Enterprise 6.3 x64
  • Microsoft Visual Studio 2015 Shell (integrated): 14.0.23107.0
  • Microsoft .NET Framework: 4.7.03056
  • BimlExpress: 1.0
  • SQL Server Data Tools: 14.0.61705.170
  • SQL Server 2016 (SP1-GDR): 13.0.4224.16(x64)

1 Ответ

3 голосов
/ 03 апреля 2019

Я воспроизвел ошибку локально на нескольких различных средах / машинах и обнаружил исправление.

Разрешение: Измените TargetServerVersion проекта SSIS с SQL Server 2014 на SQL Server 2016. В результате полученное сообщение после запуска пакета будет SSIS package finished: Success.

Почему:

Что-то в этих средах не хватает необходимых частей для работы с TargetServerVersion SQL Server 2014, связанным с интерфейсом IDTSVariables100. Этот интерфейс относится к SQL Server .NET SDK 2017 2016. https://docs.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.dts.runtime.wrapper.idtsvariables100?view=sqlserver-2017

О TargetServerVersion и ProjectVersion Энди Леонард объясняет в своем блоге:

"свойство TargetServerVersion можно использовать для поддержки текущей производственной версии проекта SSIS с использованием новейших инструментов, если текущей производственной версией является SSIS 2012+. А свойство TargetServerVersion можно обновить до последней версия доступна простым изменением значения в выпадающем списке ". https://andyleonard.blog/2018/08/a-tale-of-two-properties-ssis-projectversion-and-targetserverversion/

<ProductVersion>14.0.600.250</ProductVersion>

Дополнительные мысли приведены ниже в разделе Дополнительные ссылки для SSDT .

Как к:

  1. Щелкните правой кнопкой мыши проект SSIS [MySsisProject (SQL Server 2014)] в Visual Studio и выберите Свойства.

select Properties of SSIS project

  1. На недавно открытой странице свойств разверните группу «Свойства конфигурации» и выберите «Общие». Затем выберите соответствующий TargetServerVersion (SQL Server 2016 в моей ситуации)

select TargetServerVersion

  1. Прочтите предупреждение с указанием возможных проблем с расширениями и определите, хотите ли вы продолжить.

TargetServerVersion Change Warning

Теперь в проекте SSIS SQL Server 2016 указан в скобках после имени проекта, MySsisProject (SQL Server 2016). Это решает проблему. Затем выполните пакет локально, чтобы проверить успешное завершение пакета.

Испытанные среды / машины:

  1. Окружающая среда:

    • Windows 10 Enterprise 6.3 x64
    • Microsoft Visual Studio 2015 Shell (integrated): 14.0.23107.0
    • Microsoft .NET Framework: 4.7.03056
    • BimlExpress: 1.0
    • SQL Server Data Tools: 14.0.61705.170
    • SQL Server 2016 (SP1-GDR): 13.0.4224.16(x64)
  2. Окружающая среда:

    • Windows 10 Enterprise 6.3 x64
    • Microsoft Visual Studio Enterprise 2017: 15.9.8
    • Microsoft .NET Framework: 4.7.03056
    • BimlExpress: 1.0
    • SQL Server Data Tools: 15.1.61902.21100
    • SQL Server 2016 (SP1-GDR): 13.0.4224.16(x64)
  3. Окружающая среда:

    • Windows Server 2012 R2 Datacenter 6.3 x64
    • Microsoft Visual Studio Professional 2015: 14.0.25431.01 Update 3
    • Microsoft .NET Framework: 4.7.02053
    • BimlExpress: 1.0
    • SQL Server Data Tools: 14.0.61705.170
    • SQL Server 2016 (SP1): 13.0.4001.0(x64)

Дополнительный справочник по SSDT (средства данных SQL Server):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...