Tag: ssis

SSIS – 将OLEDB连接的Excel文件移动到存档

我使用Microsoft Office 12.0 Access Database Engine OLE DB Provider作为Excel架构创建了一个连接,以循环遍历Excel文件中的所有工作表,如此问题中所示如何使用SSIS包循环Excel文件并将其加载到数据库中? 并使用Foreach ADO.NET Schema Rowset Enumerator循环遍历excel文件。 现在一切正常,但从Excel导入数据后,我想将该文件移动到Archive文件夹。 并尝试使用File System Task ,但我得到错误 [文件系统任务]错误:出现以下错误消息时出错:“进程无法访问该文件,因为它正被另一个进程使用。” 我也试过这个链接的脚本任务。 但我得到了一些错误,无法解决错误,因为我对C#一无所知。 下面是我尝试使用脚本任务移动文件时遇到的错误。 在System.ReflectionMethodHandle.InvokeMethod(Object target,Object [] arguments,Signature sig,Boolean constructor)at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object [] parameters,Object [] arguments)at System.Reflection.RuntimeMethodInfo。 System.RuntimeType.InvokeMember的Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture ,String [] namedParams)在Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()。 更新 : […]

使用SSIS和脚本组件移动文件

我需要在SSIS中的脚本组件中编写一个代码,将代码文件移动到相应的文件夹中。 我得到的文件通常被命名,例如“Dem323_04265.45.23.4”,“Dem65_459.452.56”,“Ec2345_456.156.7894”,我需要将它们移动到相应的文件夹。 我的文件夹的名称是“Oklahoma City(323)”,“New York(65)”..我需要将这些文件移动到匹配的文件夹,例如“Dem323_04265.45.23.4”将转到文件夹“Oklahoma City” (323)”。 我需要修改我的代码,使位于前两个或三个字母和下划线之间的数字匹配位于括号中的数字。 我已经做了好几天了,而且我是ssis和c#的新手,所以任何帮助都会受到赞赏。 这是我到目前为止的代码: public void Main() { string filename; // string datepart; bool FolderExistFlg; filename = Dts.Variables[“User::FileName”].Value.ToString(); // datepart = (filename.Substring(filename.Length – 12)).Substring(0, 8); var folderNumber = Regex.Match( filename, //Dts.Variables[“OutputMainFolder”].Value.ToString(), @”\(([^)]*)\)”).Groups[1].Value; FolderExistFlg = Directory.Exists(Dts.Variables[“OutputMainFolder”].Value.ToString() + “\\” + folderNumber); if (!FolderExistFlg) { Directory.CreateDirectory(Dts.Variables[“OutputMainFolder”].Value.ToString() + “\\” + folderNumber); } File.Move(Dts.Variables[“SourceFolder”].Value.ToString() […]

SSIS自定义转换接收变量

我正在C#中创建一个用于SSIS的自定义转换。 我已经能够创建和添加自定义组件并从数据库源接收和更改数据,但我需要更多数据才能在日志表中注册。 这些数据只能与变量一起传递,但我找不到如何向我的组件添加readonlyvariable的良好解释。 我曾尝试使用IDTSVa​​riable100和VariableDispenser,但我无法理解如何使用。 public override void ProvideComponentProperties() { base.ProvideComponentProperties(); base.RemoveAllInputsOutputsAndCustomProperties(); VariableDispenser varDispenser = this.VariableDispenser(); IDTSVariable100 vr = this.VariableDispenser.GetVariables(); IDTSInput100 input = this.ComponentMetaData.InputCollection.New(); input.Name = “Input_B”; IDTSOutput100 output=this.ComponentMetaData.OutputCollection.New(); output.Name = “Output_B”; // the output is synchronous with the input output.SynchronousInputID = input.ID; } 基本上我想定义readonlyvariables ,我可以在自定义组件运行之前改变值,就像原始的“脚本组件”一样。

AMO OLAP QueryBinding

有时我需要在Cube中更改Customer维度的源表,具体取决于业务逻辑。 以前我使用以下代码更改了多维数据集的结构: MyServerDataSourceView.Schema.Tables[“DimCustomers”].ExtendedProperties[“QueryDefinition”] = “new query”; MyServerDataSourceView.Update(); // update to new definition DimCustomer.Process(ProcessType.ProcessAdd, EF); MyServerDataSourceView.Schema.Tables[“DimCustomers”].ExtendedProperties[“QueryDefinition”] = “old regularquery”; MyServerDataSourceView.Update(); // revert back to old definition 但它并不值得信任。 有时它不会恢复查询定义。 Visual Studio显示可以使用queryBinding 。 我正在尝试这样的代码: string queryAdd = “SELECT [a],[b],[c] FROM ase.newtable”; QueryBinding queryBinding = new QueryBinding(); queryBinding.QueryDefinition = queryAdd; DimCustomer.Process(ProcessType.ProcessAdd, queryBinding); 并得到以下错误,并没有多说: 警告:ProcessAdd客户维度的0x80019002 – 序列容器:SSIS警告代码DTS_W_MAXIMUMERRORCOUNTREACHED。 执行方法成功,但引发的错误数(1)达到允许的最大值(1); 导致失败。 当错误数达到MaximumErrorCount中指定的数量时,会发生这种情况。 […]

无法在GAC中添加SSIS中的引用

我创建了2个类库,abc.utility.dll和xyz.utility.dll 我已使用命令提示符在GAC中注册了此项。 但是,当我打开我的SSIS包并尝试从.NET选项卡添加abc和xyz的引用时。 我无法在.NET选项卡中看到这些dll。 我通过拖放到c:/ windows / assembly添加了两个dll使用Windows资源管理器并尝试使用浏览选项添加它,但它没有将这些dll添加到我的项目中。 从我的重复问题 我在2008年有一个SSIS包。我在visual studio 2010中创建了一些库,并在3.5中编译。 我需要将这些库集成到SSIS包中。 我将这些库注册到GAC中,但是当我尝试将这些dll的引用添加到SSIS中时,我没有在Add Reference – > .Net部分找到。 然后我必须通过编译的dll中的browse选项添加dll。 编译SSIS时没有问题。 一旦我运行SSIS包,它就会显示以下错误 System.Reflection.TargetInvocationException:调用目标抛出了exception。 —> System.IO.FileNotFoundException:无法加载文件或程序集’Utility,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 632cda921675b9e7’或其依赖项之一。 该系统找不到指定的文件。 文件名:’Utility,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 632cda921675b9e7’at at ST_969c7b257dd94f948f31afd96a2b2afd.csproj.ScriptMain.Main() 预绑定状态信息=== LOG:User = SEI-DOMAIN-1 \ PSaha LOG:DisplayName = Utility,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 632cda921675b9e7(完全指定)LOG:Appbase […]

Active Directory:调整函数的性能以检索组成员

这篇文章是对以下内容的跟进: Active Directory:DirectoryEntry成员列表 GroupPrincipal.GetMembers() 我有一个函数,它检索Active Directory中组的所有成员的distinguishedName属性。 此函数用于检索所有用户和组对象的大型脚本(总运行时间为7-10分钟)。 我的问题是distinguishedName上的下游SSIS查找非常慢。 这并不奇怪,因为它正在查找varchar(255)与UniqueIdentifier(16字节)。 我可以在源代码上执行SQL Select,然后使用Merge Join,这会加快速度。 但是,我注意到提取中存在潜在竞争条件(参见上面的运行时间),其中组成员存在而没有匹配的distinguishedName。 如果是这种情况,那么我需要解决这个问题; 但是,合并连接不会使加载失败,而查找可以设置为使加载失败。 所以,我需要通过distinguishedName动态获取guid。 但是,当我尝试使用下面的方法时,GetGroupMemberList函数的性能大幅下降。 是否有更好/更快的方式通过distinguishedName获取组成员guid? 方法(两个循环): listGroupMemberGuid.Add(new DirectoryEntry(“LDAP://” + member, null, null, AuthenticationTypes.Secure).Guid); listGroupMemberGuid.Add(new DirectoryEntry(“LDAP://” + user, null, null, AuthenticationTypes.Secure).Guid); function: private List GetGroupMemberList(string strPropertyValue, string strActiveDirectoryHost, int intActiveDirectoryPageSize) { // Variable declaration(s). List listGroupMemberDn = new List(); string strPath = strActiveDirectoryHost […]

使用Ionic.Zip dll在SSIS中解压缩受密码保护的文件

我要求解压缩包含zip文件中受密码保护的文本文件的文件。必须在SSIS包中完成。 我用google搜索并下载了一个名为Ionic.Zip的dll,用于脚本任务。 我在脚本任务中使用了c#以下代码。 using Ionic.Zip; public void Main() { Dts.TaskResult = (int)ScriptResults.Success; start obj= new start(); obj.decrypt(); } public class start { public void decrypt() { string sfilepath =”E:\\shekar\\CIF_Files\\USAGE.zip”; ZipFile fileToExtract = new ZipFile(sfilepath); fileToExtract.Password = “ftp122”; fileToExtract.ExtractAll(“E:\\shekar\\CIF_Files”); } } 但我得到一个exception消息,如下所示 我有很多谷歌。 但找不到正确的解决方案。 有没有人certificate我回答

SSIS C#脚本不兼容

我最近接管了基于SSIS ETL的流程,由于一些许可问题,我不得不从Data Tools 2013升级到2015年。大部分项目在升级后幸存下来并且运行良好。 但是,在两个包中,我有一个非常简单的C#方法(脚本转换)来解析导致某些问题的一些数据。 目前,使用“build”(不是通过SSIS目录的较新开发方法)完成部署,SQL SERVER Job的步骤直接指向dtsx文件。 该作业是在SQL SERVER 2014中创建的,它按步骤调度ETL。 服务器具有64位配置。 我试图将SSIS项目属性“Run64BitRuntime”更改为False并强制失败的步骤使用32位运行时。 此外,我还尝试使用相同的配置重新创建组件,但两者都不起作用。 奇怪的是,当我从SSIS运行包时,它成功完成但作业崩溃并抛出以下错误消息: *“decode”是转换脚本组件的名称 消息…开始:11:32:30 PM错误:2015-12-12 23:32:31.26代码:0xC0047062源:stg stg(decode [2])描述:Microsoft.SqlServer.Dts.Pipeline.ComponentVersionMismatchException:解码版本与此版本的DataFlow不兼容。 [[指定组件的版本或管道版本或两者都高于当前版本。 此软件包可能是在新版本的DTS或组件上创建的,而不是安装在当前PC上。]]在Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostCheckAndPerformUpgrade(IDTSManagedComponentWrapper100 wrapper,Int32 lPipelineVersion)结束错误错误:2015-12 -12 23:32:31.26代码:0xC004801F源:stg stg(SSIS.Pipeline)描述:“decode”的组件元数据无法升级到组件的较新版本。 PerformUpgrade方法失败。 结束错误错误:2015-12-12 23:32:31.28代码:0xC004801F源:stg SSIS.Pipeline描述:“decode,clsid {33D831DE-5DCF-48F0-B431-4D327B9E785D}”的组件元数据无法升级到较新版本的组件。 PerformUpgrade方法失败。 结束错误错误:2015-12-12 23:32:31.28代码:0xC0048021源:stg decode [2]描述:组件丢失,未注册,无法升级或缺少必需的接口。 此组件的联系信息是“包含并运行自定义脚本代码。例如,应用限制”收入“列中有效值范围的业务规则,或者在两列中添加值并计算总和的平均值。 Microsoft Corporation; Microsoft SQL Server; Microsoft Corporation;保留所有权利; http://www.microsoft.com/sql/support;9 “。 结束错误错误:2015-12-12 23:32:31.28代码:0xC0047017源:stg SSIS.Pipeline描述:解码validation失败并返回错误代码0xC0048021。 结束错误错误:2015-12-12 23:32:31.28代码:0xC004700C源:stg SSIS.Pipeline描述:一个或多个组件validation失败。 结束错误错误:2015-12-12 […]

从SSIS 2012中的脚本组件中的PipelineBuffer获取列名

我试图从我的脚本组件转换中的PipelineBuffer获取列名和索引是SSIS并将它们添加到Hashtable。 我知道如果我将我的类更改为: public class ScriptMain : UserComponent to ScriptMain : PipelineComponent并使用此代码: public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer Buffer) { inputBuffer = Buffer; hash = new Hashtable(); IDTSInput100 i = ComponentMetaData.InputCollection.GetObjectByID(InputID); foreach (IDTSInputColumn100 col in i.InputColumnCollection) { int colIndex = BufferManager.FindColumnByLineageID(i.Buffer, col.LineageID); hash.Add(col.Name, colIndex); } } 然而; 当我这样做时,我不能再覆盖: public override void Input0_ProcessInputRow(Input0Buffer Row)因为这在PipelineComponent类中不可用,我不能再通过调用类似这样的东西来访问我的连接管理器: IDTSConnectionManager100 connMgr = […]

SSS中的TFS集成

我在一个解决方案中使用VS2013 ( .NET 4.5 Framework )开发的SSIS包很少。 在另一个解决方案中使用VS2012 ( .NET 4.0 Framework )开发的包很少。 我想将这两个解决方案与TFS集成。 目前,我已经将VS2013与TFS集成,其工作正常。 但是,如果我想将VS2012开发的SSIS与相同的TFS集成VS2012 。 有两个问题: 我是否需要进行TFS安装必须在VS2012完成,或者我VS2012可以为VS2013安装相同的TFS 。 当我将这些VS2012解决方案添加到现有TFS ,我的构建被某些东西压倒了并且被破坏了。 如何在TFS保留不同框架的两种解决方案?