如何通过代码复制现有SSIS包到新项目?报错提示已添加至其他项目
解决SSIS包复制到新项目的问题
你碰到的这个问题很典型——你并没有真正复制出一个独立的SSIS包实例,只是把原包的对象引用赋值给了newPackage变量。这个包仍然属于原项目,所以尝试添加到新项目时就会触发"已被添加"的错误,而新项目最终为空也是因为这个添加操作失败了。
要实现真正的复制,你需要通过序列化+反序列化的方式生成一个完全独立的Package实例,具体步骤如下:
核心思路
SSIS的Package对象可以序列化为XML格式,我们先把原包序列化为XML内容,再从XML反序列化出一个全新的Package实例,这个新实例就不再关联原项目,能安全添加到新项目中。
修正后的代码示例
using System.IO; using Microsoft.SqlServer.Dts.Runtime; // 获取现有项目和包 var ssisProject = Project.OpenProject(@"C:\Packages\CommonPackageTest.ispac"); Package originalPackage = ssisProject.PackageItems["CommonPackageTest.dtsx"].Package; // 创建新项目 Project newProject = Project.CreateProject(); // 序列化原包到内存流(XML格式) Package newPackage; using (MemoryStream ms = new MemoryStream()) { // 保存原包到内存流 originalPackage.SaveToXml(ms, null); // 重置流位置到起始点 ms.Position = 0; // 从内存流加载出全新的包实例 newPackage = Package.LoadFromXml(ms, null); } // 将新包添加到新项目,指定新的包文件名 newProject.PackageItems.Add(newPackage, "NewPackage.dtsx"); // 记得保存新项目到指定路径 newProject.SaveAs(@"C:\Packages\NewSSISProject.ispac");
关键代码解释
originalPackage.SaveToXml(ms, null):把原包的内容序列化为XML,写入内存流中。第二个参数可以传入IDTSEvents对象处理事件,这里用null即可满足基础需求。ms.Position = 0:序列化完成后流的指针停在末尾,必须重置到起始位置才能正确读取XML内容。Package.LoadFromXml(ms, null):从内存流的XML内容加载出一个全新的Package实例,这个实例和原包没有引用关联,属于完全独立的对象。
额外注意事项
- 确保你的项目引用了正确的SSIS程序集:
Microsoft.SqlServer.ManagedDTS.dll,通常在SQL Server安装目录下的100\SDK\Assemblies(对应SQL Server 2008)或更高版本的路径中。 - 如果原包包含项目级连接管理器、参数等依赖,你可能需要同时复制这些依赖到新项目中,否则新包运行时可能出现依赖缺失的错误。
内容的提问来源于stack exchange,提问作者navig8tr
相关产品推荐
相关产品推荐

