SSIS 脚本任务引发的错误

Posted

技术标签:

【中文标题】SSIS 脚本任务引发的错误【英文标题】:Error being thrown by SSIS script task 【发布时间】:2017-12-26 11:01:21 【问题描述】:

我正在努力将 2005 SSIS 包升级到 2016。我已经升级了这个包,但是当我尝试运行它时,它会中断控制流中的脚本任务。

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
#endregion

namespace ST_9752d9eb585d4a4d97a334ef01ccf313


[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

    public void Main()
    

        string fileName;

        fileName = Dts.Variables["User::Source_File_And_Path"].Value.ToString();

        using (StreamWriter w = File.AppendText(fileName))
        
            w.Write("\r\n");
            w.Close();
        

            Dts.TaskResult = (int)ScriptResults.Success;
    

    #region ScriptResults declaration
    /// <summary>
    /// This enum provides a convenient shorthand within the scope of this class for setting the
    /// result of the script.
    /// 
    /// This code was generated automatically.
    /// </summary>
    enum ScriptResults
    
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    ;
    #endregion



此脚本任务用于将 CRLF 添加到文件中数据的末尾。我在代码中添加了断点,我看到它在 using (StreamWriter w = file.AppendText(fileName)) 行处中断。 I am receiving the following error.

以下是异常详情:

System.ArgumentException 未被用户代码处理 H结果=-2147024809 消息=路径中有非法字符。 源=mscorlib 堆栈跟踪:

在 System.Security.Permissions.FileIOPermission.EmulateFileIOPermissionChecks(String fullPath) 在 System.IO.FileStream.Init(字符串路径、FileMode 模式、FileAccess 访问、Int32 权限、Boolean useRights、FileShare 共享、Int32 bufferSize、FileOptions 选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath、Boolean checkHost) 在 System.IO.FileStream..ctor(字符串路径,FileMode 模式,FileAccess 访问,FileShare 共享,Int32 bufferSize,FileOptions 选项,字符串 msgPath,布尔 bFromProxy,布尔 useLongPath,布尔 checkHost) 在 System.IO.StreamWriter.CreateFile(字符串路径,布尔附加,布尔检查主机) 在 System.IO.StreamWriter..ctor(字符串路径,布尔附加,编码编码,Int32 缓冲区大小,布尔检查主机) 在 System.IO.StreamWriter..ctor(字符串路径,布尔附加) 在 System.IO.File.AppendText(字符串路径) 在 ST_9752d9eb585d4a4d97a334ef01ccf313.ScriptMain.Main() 在 c:\Users\aluhman\AppData\Local\Temp\2\Vsta\5c1672d48682401d852b1b44649f951b\ScriptMain.cs:line 31 内部异常:

这一切都在 2005 年有效,这是我现在在 2016 年看到的一个新错误。

【问题讨论】:

尝试将异常详细信息复制到剪贴板。然后粘贴到记事本中。那么错误可能是由于文件名包含文件名中不允许的字符。 检查你的fileName 这是文件名“F:\\Data_Imports\\Company\\Inbound\\Customers_*.txt” 【参考方案1】:

您不能一次打开每个文件,而是必须一个一个地遍历它们:

类似:

string fileName = Dts.Variables["User::Source_File_And_Path"].Value.ToString();
string [] fileEntries = Directory.GetFiles(Path.GetFullPath(fileName));
foreach (string f in fileEntries)

     if (Path.GetExtension(f).ToUpper()==".TXT".ToUpper() && f.StartsWith("Customers_")==true)
     
        using (StreamWriter w = File.AppendText(f))
            
                w.Write("\r\n");
                w.Close();
            
     

【讨论】:

以上是关于SSIS 脚本任务引发的错误的主要内容,如果未能解决你的问题,请参考以下文章

部署时SSIS任务脚本损坏

SSIS 脚本任务抛出未设置为对象实例的对象引用

SSIS 数据流脚本任务错误处理

调用目标引发的运行时错误豁免

无法使用脚本任务从 SSIS 发送邮件 - 超时

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误