ssis - 为什么 BIML ScriptTask 会失败,直到我在 VS 中打开脚本并保存包

标签 ssis script-task biml

我有这个 BIML 脚本,它创建一个主包和子包。子包中有一个 ScriptTask,它将父包变量的值映射到子包变量。当我在 SSIS(Visual Studio 2015,目标 Sql Server 2014)中生成包时,它们生成得很好。如果我运行主包,子包将失败并出现以下错误:

DTS Script Task has encountered an exception in user code:
Project name:  ST_GetJobLogIdHere
Exception has been thrown by the target of an invocation.

at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

当我在子进程中打开 ScriptTask,然后再次关闭它时,包是脏的,所以我保存它。之后,运行包就可以正常工作了。

这是 BIML 脚本:

<Biml xmlns="http://schemas.varigence.com/biml.xsd">

    <ScriptProjects>
        <ScriptTaskProject ProjectCoreName="ST_GetJobLogId" Name="ST_GetJobLogIdScript" VstaMajorVersion="0">
            <ReadOnlyVariables>
                <Variable Namespace="User" VariableName="vMasterJobLogId" DataType="Int32" />
            </ReadOnlyVariables>
            <ReadWriteVariables>
                <Variable Namespace="User" VariableName="vJobLogId" DataType="Int32" />
            </ReadWriteVariables>
            <AssemblyReferences>
                <AssemblyReference AssemblyPath="Microsoft.SqlServer.ManagedDTS" />
                <AssemblyReference AssemblyPath="Microsoft.SqlServer.ScriptTask" />
                <AssemblyReference AssemblyPath="System" />
                <AssemblyReference AssemblyPath="System.Data" />
                <AssemblyReference AssemblyPath="System.Windows.Forms" />
                <AssemblyReference AssemblyPath="System.Xml" />
            </AssemblyReferences>
            <Files>
                <File Path="AssemblyInfo.cs" BuildAction="Compile">
                    using System.Reflection;

                    [assembly: AssemblyTitle("ST_GetJobLogId")]
                    [assembly: AssemblyDescription("")]
                    [assembly: AssemblyConfiguration("")]
                    [assembly: AssemblyCompany("")]
                    [assembly: AssemblyProduct("ST_GetJobLogId")]
                    [assembly: AssemblyCopyright("Copyright @ BMI 2017")]
                    [assembly: AssemblyTrademark("")]
                    [assembly: AssemblyCulture("")]
                    [assembly: AssemblyVersion("1.0.*")]
                </File>
                <File Path="ScriptMain.cs" BuildAction="Compile">
                    using Microsoft.SqlServer.Dts.Runtime;

                    namespace ST_GetJobLogId
                    {
                        [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPoint]
                        public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
                        {
                            public void Main()
                            {
                                int jobLogId = (int)Dts.Variables["User::vMasterJobLogId"].Value;
                                if (jobLogId != 0)
                                    Dts.Variables["User::vJobLogId"].Value = jobLogId;
                                Dts.TaskResult = (int)ScriptResults.Success;
                            }
                            enum ScriptResults
                            {
                                Success = DTSExecResult.Success,
                                Failure = DTSExecResult.Failure
                            };
                        }
                    }
                </File>
            </Files>
        </ScriptTaskProject>
    </ScriptProjects>

    <Packages>
        <Package Name="Master" ProtectionLevel="EncryptSensitiveWithUserKey">
            <Variables>
                <Variable Name="vMasterJobLogId" DataType="Int32">1</Variable>
            </Variables>
            <Tasks>
                <ExecutePackage Name="PKG - Execute FixMe">
                    <ExternalProjectPackage Package="FixMe.dtsx" />
                </ExecutePackage>
            </Tasks>
        </Package>
        <Package Name="FixMe" ProtectionLevel="EncryptSensitiveWithUserKey">
            <Variables>
                <Variable Name="vJobLogId" DataType="Int32">0</Variable>
            </Variables>
            <Tasks>
                <Script Name="SCR - Get vJobLogId from parent vMasterJobLogId" ProjectCoreName="ST_GetJobLogIdHere" >
                    <ScriptTaskProjectReference ScriptTaskProjectName="ST_GetJobLogIdScript" />
                </Script>
            </Tasks>
        </Package>
    </Packages>

</Biml>

我错过了什么?为什么在我手动打开代码窗口之前包会失败? 在此先感谢您的帮助, 西蒙

最佳答案

阅读上面的评论以澄清问题。

事实证明,Visual Studio 2015 中的 BIML Express/BidsHelper 不知道项目属性中设置了哪个 SQL Server 目标版本。

解决方案是安装 VS2013/SSDT 2014 和 BIML Express for VS2013,以便能够正确生成 SSIS 2014 包。

VS 2015/SSDT/BIML Express 将仅生成 SQL Server SSIS 2016 包的脚本任务。

感谢比尔的回答。

关于ssis - 为什么 BIML ScriptTask 会失败,直到我在 VS 中打开脚本并保存包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42843047/

相关文章:

ssis - 使用 BIML 添加脚本任务

excel - SSIS在有数据时将列读取为NULL

sql-server - 错误”...非错误输出上的 OLE DB Source.Outputs[OLE DB Source Output].Columns[XXXXXXXX] 没有相应的输出

包含变量的 SSIS 源 SQL 语句

c# - 在 C# 中的 REPLACE 函数中添加 Case 语句

c# - 替换多个 SSIS 包中的脚本任务

sql-server - 使用 "There is a compilation error. Do you want to save anyway"消息保存后,C# 代码从脚本任务中消失

sql - 只需使用 SSIS BIML 勾选模糊查找转换对象中的复选框即可

sql - 在 x 执行时间后终止 SSIS Foreach 循环?

ssis - BIML:有关 varchar > 255 的 ODBC 源列上数据类型处理的问题