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 文件的第一张表的主要内容,如果未能解决你的问题,请参考以下文章