Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS/C#:脚本任务,用于查看目录并将1个文件的名称存储在变量中的C#脚本_Ssis - Fatal编程技术网

SSIS/C#:脚本任务,用于查看目录并将1个文件的名称存储在变量中的C#脚本

SSIS/C#:脚本任务,用于查看目录并将1个文件的名称存储在变量中的C#脚本,ssis,Ssis,基本上,我已经为SSIS中的脚本任务编写了一个C#脚本,该脚本在User::Directory中查找1个csv,如果&仅当有一个文件时,它将该文件存储在实例变量中,然后映射到SSIS的包变量 当我退出时,它会给我脚本任务的红色填充框。我认为这与我如何查看目录有关,但我不确定 请帮忙 using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Windows.Forms; using Sy

基本上,我已经为SSIS中的脚本任务编写了一个C#脚本,该脚本在User::Directory中查找1个csv,如果&仅当有一个文件时,它将该文件存储在实例变量中,然后映射到SSIS的包变量

当我退出时,它会给我脚本任务的红色填充框。我认为这与我如何查看目录有关,但我不确定

请帮忙

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;

namespace ST_e8b4bbbddb4b4806b79f30644240db19.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
       private String fileName = "";
       private String RootDirictory;
       private String FilePath;

       enum ScriptResults
       {
           Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
           Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
       };

       public ScriptMain()
       {
           RootDirictory = Dts.Variables["RootDir"].Value.ToString();
           FilePath = RootDirictory + "\\" + "SourceData" + "\\";
       }

       public void setFileName()
       {
           DirectoryInfo YDGetDir = new DirectoryInfo(FilePath);
           FileInfo[] numberOfFiles = YDGetDir.GetFiles(".csv");

           if (numberOfFiles.Length < 2)
           {
               fileName = numberOfFiles[0].ToString(); 
           }

          int fileNameLen = fileName.Length;

          String temp = fileName.Substring(0, fileNameLen - 5);

          fileName = temp; 
       }


       public void mapStateToPackage()
       {
           if((fileName!=null)||(fileName!=""))
           {
               Dts.Variables["ExDFileName"].Value = fileName; 
           }
       }

        public void Main()
        {
            setFileName();
            mapStateToPackage(); 
            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}
使用系统;
使用系统数据;
使用Microsoft.SqlServer.Dts.Runtime;
使用System.Windows.Forms;
使用System.IO;
名称空间ST_E8B4BBDB4B4806B79F30644240DB19.csproj
{
[System.AddIn.AddIn(“ScriptMain”,Version=“1.0”,Publisher=”“,Description=”“)]
公共部分类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
私有字符串fileName=“”;
私有字符串根目录;
私有字符串文件路径;
枚举脚本结果
{
Success=Microsoft.SqlServer.Dts.Runtime.dtsesecresult.Success,
Failure=Microsoft.SqlServer.Dts.Runtime.dtsesecresult.Failure
};
公共脚本main()
{
RootDirictory=Dts.Variables[“RootDir”].Value.ToString();
FilePath=rootdirectory+“\\”+“SourceData”+“\\”;
}
public void setFileName()
{
DirectoryInfo YDGetDir=新的DirectoryInfo(FilePath);
FileInfo[]numberOfFiles=YDGetDir.GetFiles(“.csv”);
如果(numberOfFiles.Length<2)
{
fileName=numberOfFiles[0].ToString();
}
int fileNameLen=fileName.Length;
String temp=fileName.Substring(0,fileNameLen-5);
文件名=临时文件;
}
public void mapStateToPackage()
{
如果((文件名!=null)| |(文件名!=“”))
{
变量[“ExDFileName”]。值=文件名;
}
}
公共图书馆
{
setFileName();
mapStateToPackage();
Dts.TaskResult=(int)ScriptResults.Success;
}
}
}

这可以简单地使用
Foreach循环容器来完成,如中所述,这是您要求的。:-)

无论如何,请回答有关您提供的
脚本任务代码
的问题。以下提到的原因可能是问题的原因:

  • 您正在查找
    .csv
    。这不会返回任何结果,因为您正在查找扩展名为
    .csv
    但没有名称的文件。标准应为*.csv

  • 如果只查找一个文件,则条件
    If(numberofiles.Length<2)
    应更改为
    If(numberofiles.Length==1)

  • 提取文件名的if部分后的代码部分应在上述if条件内,而不是在其外侧。这样做是为了防止在空字符串上应用子字符串功能

  • 修改后的代码可在脚本任务代码部分找到

  • 对不起,我冒昧地简化了代码。我并不是说这是实现此功能的最佳方式,但这只是对问题的回答

    希望有帮助

    脚本任务代码:

    C#只能在SSIS 2008及以上版本中使用的代码

    /*
       Microsoft SQL Server Integration Services Script Task
       Write scripts using Microsoft Visual C# 2008.
       The ScriptMain is the entry point class of the script.
    */
    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Runtime;
    using System.Windows.Forms;
    using System.IO;
    
    namespace ST_3effcc4e812041c7a0fea69251bedc25.csproj
    {
        [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
        public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
        {
            Variables varCollection = null;
            String fileName = string.Empty;
            String fileNameNoExtension = string.Empty;
            String rootDirectory = string.Empty;
            String filePath = string.Empty;
    
            #region VSTA generated code
            enum ScriptResults
            {
                Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
                Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
            };
            #endregion
    
            public void Main()
            {
                Dts.VariableDispenser.LockForRead("User::RootDir");
                Dts.VariableDispenser.LockForWrite("User::ExDFileName");
                Dts.VariableDispenser.GetVariables(ref varCollection);
    
                rootDirectory = varCollection["User::RootDir"].Value.ToString();
                filePath = rootDirectory + @"\SourceData\";
    
                DirectoryInfo YDGetDir = new DirectoryInfo(filePath);
                FileInfo[] numberOfFiles = YDGetDir.GetFiles("*.csv");
    
                if (numberOfFiles.Length == 1)
                {
                    fileName = numberOfFiles[0].ToString();
                    fileNameNoExtension = fileName.Substring(0, fileName.LastIndexOf("."));
                }
                if (!String.IsNullOrEmpty(fileNameNoExtension))
                {
                    varCollection["User::ExDFileName"].Value = fileNameNoExtension;
                }
    
                Dts.TaskResult = (int)ScriptResults.Success;
            }
        }
    }