SSIS 脚本任务 C# 编码以动态选择具有特定名称的最新 Excel 文件的第一张表

Posted

技术标签:

【中文标题】SSIS 脚本任务 C# 编码以动态选择具有特定名称的最新 Excel 文件的第一张表【英文标题】:SSIS script task C# coding to dynamically select the first sheet of the latest Excel file with a particular name 【发布时间】:2016-02-29 06:16:38 【问题描述】:

我对 C# 编码非常陌生。通过不断搜索,我能够获得以下代码来选择名称包含字符串“国家/地区”的最新 Excel 文件。现在我只需要动态选择第一张工作表,因为每次我得到一个文件时工作表名称都会改变。 我修改了如下代码:

public void Main()
    
        // TODO: Add your code here
        var directory = new     DirectoryInfo(Dts.Variables["User::VarFolderPath"].Value.ToString());


        FileInfo[] files = directory.GetFiles();
        DateTime lastModified = DateTime.MinValue;

        foreach (FileInfo file in files)
        
            Match m = Regex.Match(file.FullName, "Country");
            if (file.LastWriteTime > lastModified && m.Success)
            
                lastModified = file.LastWriteTime;
                Dts.Variables["User::VarFileName"].Value = file.ToString();



                string filename = (string)Dts.Variables["User::VarFileName"].Value;
                string sheetName = null;

                string connStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=0;Extended Properties=\"EXCEL 12.0;HDR=YES;\"", filename);

                var conn = new OleDbConnection(connStr);
                try
                
                    conn.Open();

                    using (var dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null))
                    
                        var row0 = dtSheet.Rows[0];
                        sheetName = row0["TABLE_NAME"].ToString();
                    
                
                catch (Exception)
                
                    throw;
                
                finally
                
                    conn.Close();
                    conn.Dispose();
                

                if (!String.IsNullOrEmpty(sheetName))
                
                    bool dummy = true;
                    Dts.Variables["SheetName"].Value = sheetName;
                    Dts.Events.FireInformation(1, "User::SheetName", sheetName, "", 0, ref dummy);
                    Dts.TaskResult = (int)ScriptResults.Success;
                
                else
                
                    Dts.Events.FireError(0, "User::SheetName", "No SheetName found!", String.Empty, 0);
                    Dts.TaskResult = (int)ScriptResults.Failure;
                



            
        
MessageBox.Show(Dts.Variables["User::VarFileName"].Value.ToString());
            MessageBox.Show(Dts.Variables["User::SheetName"].Value.ToString());

            Dts.TaskResult = (int)ScriptResults.Success;
        

但我收到以下错误:

在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化)
在 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象 [] 参数,签名 sig,布尔构造函数)
在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)
在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

【问题讨论】:

您在 ["User::VarFileName"] 变量中得到什么值? 在读写变量 User::VarFileName 中,我得到了名为“Country”的最新文件,该文件位于读取变量 User::VarFolderPath 中指定的路径中 【参考方案1】:

假设你的文件路径是正确的,并且你对该文件夹有足够的权限;修改您的代码并在连接中添加完整路径而不是文件名

    string fullPath = file.FullName;
    string connStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=0;
Extended Properties=\"EXCEL 12.0;HDR=YES;\"", fullPath);

此外,请确保您提到的所有变量都是只读或读写,具体取决于您在脚本任务中执行的活动。

【讨论】:

【参考方案2】:

错误之一“Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()” 是由文件夹的安全权限引起的。当您更改权限时,此错误将消失。我只记得 .dll 文件的位置。

【讨论】:

以上是关于SSIS 脚本任务 C# 编码以动态选择具有特定名称的最新 Excel 文件的第一张表的主要内容,如果未能解决你的问题,请参考以下文章

如何使 SSIS 脚本任务失败(使用 C#,2008)

SSIS常用的包—脚本和组件任务

在 SSIS 中使用 C# 从 JSON API 读取

bat删除文件夹下,特定名以外的文件和文件夹

使用 SSIS 脚本任务刷新 Excel

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