You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码复制现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:28:41