我需要一些有关动态创建包的 SSIS 脚本任务 (SQL 2008 R2) 的帮助。我正在改进一个包,它将数据从 Sage Timberline(现在更名为 Sage 300)Pervasive SQL 环境复制到 SQL Server 数据仓库。我可以创建一个包来打开与 Timberline 的连接并将数据复制到 SQL Server 中的表中。问题是,对于林中的每个公司和 SQL 中的每个表,我都需要创建一个单独的数据流任务。考虑到三个 Timberline 公司文件夹和每个文件夹中的表格数量,这将花费大量时间来创建,并且维护和故障排除也很麻烦。
我正在尝试创建一个包,该包使用 Foreach 循环来创建一个包,该包创建一个 ADO/ODBC 源(Timberline)、一个 OLE 目标(SQL)并动态处理列映射。我在这里找到了几乎可以满足我需要的代码。
我测试了这段代码,它在使用 OLE SQL 源和目标时效果很好。使这个脚本工作的原因是它动态地处理列映射。因此,如果您将其放入 100 个左右表的 Foreach 循环中,每个循环都可以动态创建数据流并映射列,然后执行新包。
我的问题是我只能使用 ODBC 连接到 Timberline。因此,我需要修改脚本以使用 ADO NET (ODBC) 而不是 OLE 创建源连接。我在试图弄清楚这一点时遇到了很多麻烦。有人可以帮我解决这个问题吗?
除了这种方法,我首先尝试了其他几件事:
解决方案:设置链接服务器到 Timberline Pervasive SQL
问题:SQL 服务器是 64 位的,而 Timberline 驱动程序是 32 位的。使用链接服务器会返回架构不匹配错误。我打电话给 Sage,他们说他们没有发布 64 位驱动器的计划。
解决方案:使用 SQL 传输任务之一
问题:仅适用于 SQL 数据库。此源是 Pervasive SQL 数据库
解决方案:使用“INSERT ... INTO ...”类型的脚本
问题:这需要一个链接服务器。看上面的问题
这是我需要帮助的原始 VB .NET 代码部分:
'To Create a package named [Sample Package]
Dim package As New Package()
package.Name = "Sample Package"
package.PackageType = DTSPackageType.DTSDesigner100
package.VersionBuild = 1
'To add Connection Manager to the package
'For source database (OLTP)
Dim OLTP As ConnectionManager = package.Connections.Add("OLEDB")
OLTP.ConnectionString = "Data Source=.;Initial Catalog=OLTP;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;"
OLTP.Name = "LocalHost.OLTP"
'To add Load Employee Dim to the package [Data Flow Task]
Dim dataFlowTaskHost As TaskHost = DirectCast(package.Executables.Add("SSIS.Pipeline.2"), TaskHost)
dataFlowTaskHost.Name = "Load Employee Dim"
dataFlowTaskHost.FailPackageOnFailure = True
dataFlowTaskHost.FailParentOnFailure = True
dataFlowTaskHost.DelayValidation = False
dataFlowTaskHost.Description = "Data Flow Task"
'-----------Data Flow Inner component starts----------------
Dim dataFlowTask As MainPipe = TryCast(dataFlowTaskHost.InnerObject, MainPipe)
' Source OLE DB connection manager to the package.
Dim SconMgr As ConnectionManager = package.Connections("LocalHost.OLTP")
' Create and configure an OLE DB source component.
Dim source As IDTSComponentMetaData100 = dataFlowTask.ComponentMetaDataCollection.[New]()
source.ComponentClassID = "DTSAdapter.OLEDBSource.2"
' Create the design-time instance of the source.
Dim srcDesignTime As CManagedComponentWrapper = source.Instantiate()
' The ProvideComponentProperties method creates a default output.
srcDesignTime.ProvideComponentProperties()
source.Name = "Employee Dim from OLTP"
' Assign the connection manager.
source.RuntimeConnectionCollection(0).ConnectionManagerID = SconMgr.ID
source.RuntimeConnectionCollection(0).ConnectionManager = DtsConvert.GetExtendedInterface(SconMgr)
' Set the custom properties of the source.
srcDesignTime.SetComponentProperty("AccessMode", 0)
' Mode 0 : OpenRowset / Table - View
srcDesignTime.SetComponentProperty("OpenRowset", "[dbo].[Employee_Dim]")
' Connect to the data source, and then update the metadata for the source.
srcDesignTime.AcquireConnections(Nothing)
srcDesignTime.ReinitializeMetaData()
srcDesignTime.ReleaseConnections()
提前致谢!