BIML с ScriptComponent создает пакет, но не открывается в SSDT - PullRequest
2 голосов
/ 01 мая 2019

ОБНОВЛЕНИЕ: Изменено сообщение, чтобы включить простейшее решение для воспроизведения проблемы.

Я борюсь с использованием ScriptComponentProject в BIML.Я использую VS 2017 и BIML Express 2018 последней версии.

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

Не так много примеров BIML для компонента сценария, но мое решение представляет собой смесь следующих документов: Varigence Doc & от Joost .

КогдаЯ компилирую BIML, он создает пакет без ошибок;однако, когда я открываю пакет, я получаю сообщение об ошибке:

«Значение не попадает в ожидаемый диапазон»

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

Любая помощь будет принята с благодарностью.

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <FlatFileConnection Name="Errors" FilePath="C:\Users\username\Desktop\BasicSSISErrors.csv" FileFormat="Errors" />
        <FlatFileConnection Name="Source" FilePath="C:\Users\username\Desktop\BasicSSIS.csv" FileFormat="Source" />
    </Connections>
    <Packages>
        <Package Name="PackageFromBIML" Language="None" ConstraintMode="LinearOnCompletion" ProtectionLevel="EncryptSensitiveWithUserKey">
            <Tasks>
                <Dataflow Name="Data Flow Task">
                    <Transformations>
                        <FlatFileSource Name="Flat File Source" LocaleId="None" FileNameColumnName="" ConnectionName="Source" />
                        <DataConversion Name="Data Conversion">
                            <DataflowOverrides>
                                <OutputPath OutputPathName="Output">
                                    <Columns>
                                        <Column ErrorRowDisposition="RedirectRow" TruncationRowDisposition="RedirectRow" ColumnName="Converted" />
                                    </Columns>
                                </OutputPath>
                            </DataflowOverrides>
                            <Columns>
                                <Column SourceColumn="Integers" TargetColumn="Converted" DataType="SByte" />
                            </Columns>
                        </DataConversion>
                        <ScriptComponentTransformation Name="Script Component" ProjectCoreName="SC_a8f35334a2234702a5f92abdcbedb4e4">
                            <InputPath OutputPathName="Data Conversion.Error" />
                            <ScriptComponentProjectReference ScriptComponentProjectName="SC_a8f35334a2234702a5f92abdcbedb4e4" />
                        </ScriptComponentTransformation>
                        <FlatFileDestination Name="Flat File Destination" LocaleId="None" ConnectionName="Errors">
                            <Header></Header>
                        </FlatFileDestination>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
    <FileFormats>
        <FlatFileFormat Name="Errors" CodePage="1252" TextQualifier="_x003C_none_x003E_" ColumnNamesInFirstDataRow="true" RowDelimiter="">
            <Columns>
                <Column Name="Integers" Length="50" DataType="AnsiString" Delimiter="Comma" MaximumWidth="50" />
                <Column Name="ErrorCode" Delimiter="Comma" />
                <Column Name="ErrorColumn" Delimiter="Comma" />
                <Column Name="ErrorColumnName" DataType="AnsiString" Delimiter="Comma" />
                <Column Name="ErrorDescription" DataType="AnsiString" Delimiter="CRLF" />
            </Columns>
        </FlatFileFormat>
        <FlatFileFormat Name="Source" CodePage="1252" TextQualifier="_x003C_none_x003E_" ColumnNamesInFirstDataRow="true" RowDelimiter="">
            <Columns>
                <Column Name="Integers" Length="50" DataType="AnsiString" Delimiter="CRLF" MaximumWidth="50" />
            </Columns>
        </FlatFileFormat>
    </FileFormats>
    <ScriptProjects>
        <ScriptComponentProject Name="SC_a8f35334a2234702a5f92abdcbedb4e4" ProjectCoreName="SC_a8f35334a2234702a5f92abdcbedb4e4.csproj">
            <OutputBuffers>
                <OutputBuffer Name="Output 0">
                    <Columns>
                        <Column Name="ErrorColumnName" Length="500" DataType="AnsiString" CodePage="1252" />
                        <Column Name="ErrorDescription" Length="500" DataType="AnsiString" CodePage="1252" />
                    </Columns>
                </OutputBuffer>
            </OutputBuffers>
            <InputBuffer Name="Input 0">
                <Columns>
                    <Column Name="ErrorCode" />
                    <Column Name="ErrorColumn" />
                </Columns>
            </InputBuffer>
            <AssemblyReferences>
                   <AssemblyReference AssemblyPath="Microsoft.SqlServer.DTSPipelineWrap.dll" />
                   <AssemblyReference AssemblyPath="Microsoft.SqlServer.DTSRuntimeWrap.dll" />
                   <AssemblyReference AssemblyPath="Microsoft.SqlServer.PipelineHost.dll" />
                   <AssemblyReference AssemblyPath="Microsoft.SqlServer.TxScript.dll" />
                   <AssemblyReference AssemblyPath="System.dll" />
                   <AssemblyReference AssemblyPath="System.AddIn.dll" />
                   <AssemblyReference AssemblyPath="System.Data.dll" />
                   <AssemblyReference AssemblyPath="System.Xml.dll" />
            </AssemblyReferences>
                        <Files>
       <!-- Left alignment of .Net script to get a neat layout in package-->
            <File Path="AssemblyInfo.cs">
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("SC_a8f35334a2234702a5f92abdcbedb4e4.csproj")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SC_a8f35334a2234702a5f92abdcbedb4e4.csproj")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

[assembly: AssemblyVersion("1.0.*")]
                           </File>

                           <File Path="main.cs">
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public partial class ScriptMain : UserComponent
{
  public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
        IDTSComponentMetaData130 componentMetaData = this.ComponentMetaData as IDTSComponentMetaData130;
        Row.ErrorColumnName = componentMetaData.GetIdentificationStringByID(Row.ErrorColumn);
    }
}
                </File>
            </Files>
        </ScriptComponentProject>
    </ScriptProjects>
</Biml>

1 Ответ

1 голос
/ 03 мая 2019

Я решил эту проблему, переключив свойства проекта служб SSIS на целевой SQL Server 2016, по умолчанию он был нацелен на SQL Server 2017.

Похоже, что это ошибка в продукте Varigence, так как это сообщение на форуме подтверждает, что другие испытывают проблему. Нет никаких обновлений от Varigence, кроме «отправить нам репо» в феврале 2019 года. Varigence заявляет, что существует «предварительная сборка», которая устраняет проблему, но предварительная сборка не связана с последующими публикациями в потоке, которые запрашивают предварительную сборку остались без ответа. Я предполагаю, это предварительная сборка . Я попробовал предварительный просмотр 2019 года, и это не решило проблему. В сообщении Скотта Керри, в котором говорится о том, что исправления для предварительной сборки не соответствуют моей ситуации, он утверждает, что проблема возникает, когда вы используете таргетинг на низкоуровневую платформу, т.е. при использовании VS 2017 для таргетинга на SQL 2016. Я этого не делал, я использовал VS2017 на целевой SQL 2017.

Я также столкнулся с другой проблемой после этого, где я получал ошибку:

Невозможно создать пользовательский компонент, убедитесь, что хотя бы один класс помечены с помощью SsisScriptTaskEntryPointattribute

Я исправил это, добавив ссылку на сборку в Microsoft.SqlServer.ScriptTask.dll. Эта ссылка на сборку не включена в примеры Varigence.

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

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <FlatFileConnection Name="Errors" FilePath="C:\Users\username\Desktop\BasicSSISErrors.csv" FileFormat="Errors" />
        <FlatFileConnection Name="Source" FilePath="C:\Users\username\Desktop\BasicSSIS.csv" FileFormat="Source" />
    </Connections>
    <ScriptProjects>
        <ScriptComponentProject ScriptLanguage="CSharp"  Name="SCR - ErrorHelper" ProjectCoreName="SC_a8f35334a2234702a5f92abdcbedb4e4">
            <AssemblyReferences>
                   <AssemblyReference AssemblyPath="Microsoft.SqlServer.DTSPipelineWrap.dll" />
                   <AssemblyReference AssemblyPath="Microsoft.SqlServer.DTSRuntimeWrap.dll" />
                   <AssemblyReference AssemblyPath="Microsoft.SqlServer.PipelineHost.dll" />
                    <AssemblyReference AssemblyPath="Microsoft.SqlServer.ScriptTask.dll" />
                   <AssemblyReference AssemblyPath="Microsoft.SqlServer.TxScript.dll" />
                   <AssemblyReference AssemblyPath="System.dll" />
                    <AssemblyReference AssemblyPath="System.Data.dll" />
                    <AssemblyReference AssemblyPath="System.Xml.dll" />
                    <AssemblyReference AssemblyPath="System.Core.dll" />
                   <AssemblyReference AssemblyPath="System.AddIn.dll" />
                   <AssemblyReference AssemblyPath="System.Data.dll" />
                   <AssemblyReference AssemblyPath="System.Xml.dll" />
            </AssemblyReferences>
                        <Files>
       <!-- Left alignment of .Net script to get a neat layout in package-->
            <File Path="AssemblyInfo.cs">
using System.Reflection;
using System.Runtime.CompilerServices;

[assembly: AssemblyTitle("SC_2bca370105ff4883a705860bac68cfba.csproj")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Varigence")]
[assembly: AssemblyProduct("SC_2bca370105ff4883a705860bac68cfba.csproj")]
[assembly: AssemblyCopyright("Copyright @ Varigence 2011")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]


[assembly: AssemblyVersion("1.0.*")]</File>
        <File Path="main.cs">
using System;
using System.Data;
using System.Linq;
using System.Net;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
  public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);

        var componentMetaData130 = this.ComponentMetaData as IDTSComponentMetaData130;
        if (componentMetaData130 != null)
        {
            // 0 means no specific column is identified by ErrorColumn, this time.
            if (Row.ErrorColumn == 0)
            {
                Row.ErrorColumnName = "Check the row for a violation of a foreign key constraint. No specific column is identified by ErrorColum";
            }
            else
            {
                Row.ErrorColumnName = componentMetaData130.GetIdentificationStringByID(Row.ErrorColumn);
            }
        }
    }
}
                </File>
            </Files>
        <OutputBuffers>
                <OutputBuffer Name="Output0">
                    <Columns>
                        <Column Name="ErrorColumnName" Length="500" DataType="AnsiString" CodePage="1252" />
                        <Column Name="ErrorDescription" Length="500" DataType="AnsiString" CodePage="1252" />
                    </Columns>
                </OutputBuffer>
            </OutputBuffers>
            <InputBuffer Name="Input0">
                <Columns>
                    <Column Name="ErrorCode" />
                    <Column Name="ErrorColumn" />
                </Columns>
            </InputBuffer>
        </ScriptComponentProject>
    </ScriptProjects>
    <Packages>
        <Package Name="PackageFromBIML" Language="None" ConstraintMode="LinearOnCompletion" ProtectionLevel="EncryptSensitiveWithUserKey">
            <Tasks>
                <Dataflow Name="Data Flow Task">
                    <Transformations>
                        <FlatFileSource Name="Flat File Source" LocaleId="None" FileNameColumnName="" ConnectionName="Source" />
                        <DataConversion Name="Data Conversion">
                            <DataflowOverrides>
                                <OutputPath OutputPathName="Output">
                                    <Columns>
                                        <Column ErrorRowDisposition="RedirectRow" TruncationRowDisposition="RedirectRow" ColumnName="Converted" />
                                    </Columns>
                                </OutputPath>
                            </DataflowOverrides>
                            <Columns>
                                <Column SourceColumn="Integers" TargetColumn="Converted" DataType="SByte" />
                            </Columns>
                        </DataConversion>
                        <ScriptComponentTransformation Name="Script Component" ProjectCoreName="SC_a8f35334a2234702a5f92abdcbedb4e4">
                            <InputPath OutputPathName="Data Conversion.Error" />
                            <ScriptComponentProjectReference ScriptComponentProjectName="SCR - ErrorHelper" />
                        </ScriptComponentTransformation>
                        <FlatFileDestination Name="Flat File Destination" LocaleId="None" ConnectionName="Errors">
                            <Header></Header>
                        </FlatFileDestination>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
    <FileFormats>
        <FlatFileFormat Name="Errors" CodePage="1252" TextQualifier="_x003C_none_x003E_" ColumnNamesInFirstDataRow="true" RowDelimiter="">
            <Columns>
                <Column Name="Integers" Length="50" DataType="AnsiString" Delimiter="Comma" MaximumWidth="50" />
                <Column Name="ErrorCode" Delimiter="Comma" />
                <Column Name="ErrorColumn" Delimiter="Comma" />
                <Column Name="ErrorColumnName" DataType="AnsiString" Delimiter="Comma" />
                <Column Name="ErrorDescription" DataType="AnsiString" Delimiter="CRLF" />
            </Columns>
        </FlatFileFormat>
        <FlatFileFormat Name="Source" CodePage="1252" TextQualifier="_x003C_none_x003E_" ColumnNamesInFirstDataRow="true" RowDelimiter="">
            <Columns>
                <Column Name="Integers" Length="50" DataType="AnsiString" Delimiter="CRLF" MaximumWidth="50" />
            </Columns>
        </FlatFileFormat>
    </FileFormats>

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