敬以直内

专注于数据库发展

SQL2005--SSIS脚本开发--脚本生成数据流

由于SQL2005的SSIS无法在运行阶段自动实现列映射,无法实现SSIS流程的通用化.
以下代码用于动态生成数据流包,并可保存一副本与相关目录.

Imports
System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper 
Public Class ScriptMain
    Public Sub Main()
        Try
            ' Create a package and add a Data Flow task.
            Dim package As Microsoft.SqlServer.Dts.Runtime.Package = New Microsoft.SqlServer.Dts.Runtime.Package()
            package.Name = "From" & _
                        Replace(Replace(Replace(Dts.Variables("SourceTable").Value.ToString, ".", ""), "]", ""), "[", "") & "To" & _
                        Replace(Replace(Replace(Dts.Variables("DestinationTable").Value.ToString, ".", ""), "]", ""), "[", "")
            package.ProtectionLevel = DTSProtectionLevel.DontSaveSensitive
            Dim e As Executable = package.Executables.Add("DTS.Pipeline.1")
            Dim thMainPipe As Microsoft.SqlServer.Dts.Runtime.TaskHost = CType(e, Microsoft.SqlServer.Dts.Runtime.TaskHost)
            thMainPipe.Name = "DFTExtractData"
            Dim dataFlowTask As MainPipe = CType(thMainPipe.InnerObject, MainPipe)
            ' Add an OLE DB connection manager to the package to manage the Source database connection.
            Dim conMgrSource As ConnectionManager = package.Connections.Add("OLEDB")
            conMgrSource.ConnectionString = "Provider=SQLOLEDB.1;" & _
              "Data Source=" & Dts.Variables("SourceServer").Value.ToString & ";Initial Catalog=" & Dts.Variables("SourceDB").Value.ToString & ";Integrated Security=SSPI;"
            conMgrSource.Name = "OLESource"
            conMgrSource.Description = "OLE DB connection to the " & Dts.Variables("SourceDB").Value.ToString & " database."
            ' Create and configure an OLE DB source component.  
            Dim source As IDTSComponentMetaData90 = dataFlowTask.ComponentMetaDataCollection.New
            source.ComponentClassID = "DTSAdapter.OleDbSource.1"
            ' Create the design-time instance of the source.
            Dim srcDesignTime As CManagedComponentWrapper = source.Instantiate()
            ' The ProvideComponentProperties method creates a default output.
            srcDesignTime.ProvideComponentProperties()
            ' Specify the connection manager.
            If source.RuntimeConnectionCollection.Count > 0 Then
                source.RuntimeConnectionCollection(0).ConnectionManagerID = package.Connections("OLESource").ID()
                source.RuntimeConnectionCollection(0).ConnectionManager = DtsConvert.ToConnectionManager90(package.Connections("OLESource"))
            End If
           ' Set the custom properties of the source.
            srcDesignTime.SetComponentProperty("OpenRowset", Dts.Variables("SourceTable").Value.ToString)
            srcDesignTime.SetComponentProperty("AccessMode", 0)
            ' Connect to the OLESource data source,
            '  and then update the metadata for the source.
            srcDesignTime.AcquireConnections(Nothing)
            srcDesignTime.ReinitializeMetaData()
            srcDesignTime.ReleaseConnections()
            ' Add an OLE DB connection manager to the package to manage the Destination database connection.
            Dim conMgrDest As ConnectionManager = package.Connections.Add("OLEDB")
            conMgrDest.ConnectionString = "Provider=SQLOLEDB.1;" & _
              "Data Source=" & Dts.Variables("DestinationServer").Value.ToString & ";Initial Catalog=" & Dts.Variables("DestinationDB").Value.ToString & ";Integrated Security=SSPI;"
            conMgrDest.Name = "OLEDestination"
            conMgrDest.Description = "OLE DB connection to the " & Dts.Variables("DestinationDB").Value.ToString & " database."

            ' Create and configure an OLE DB destination.
            Dim destination As IDTSComponentMetaData90 = dataFlowTask.ComponentMetaDataCollection.New
            destination.ComponentClassID = "DTSAdapter.OleDbDestination.1"

            ' Create the design-time instance of the destination.
            Dim destDesignTime As CManagedComponentWrapper = destination.Instantiate

            ' The ProvideComponentProperties method creates a default input.
            destDesignTime.ProvideComponentProperties()
            ' Specify the connection manager.
            If destination.RuntimeConnectionCollection.Count > 0 Then
               destination.RuntimeConnectionCollection(0).ConnectionManagerID = package.Connections("OLEDestination").ID()
              destination.RuntimeConnectionCollection(0).ConnectionManager = DtsConvert.ToConnectionManager90(package.Connections("OLEDestination"))
            End If
            ' MsgBox(Dts.Variables("DestinationTable").Value.ToString)
            ' Set the custom properties of the source.
            destDesignTime.SetComponentProperty("AccessMode", 0)
            destDesignTime.SetComponentProperty("OpenRowset", Dts.Variables("DestinationTable").Value.ToString) 

            'reinitialize the component 
            destDesignTime.AcquireConnections(Nothing)
            destDesignTime.ReinitializeMetaData()
            destDesignTime.ReleaseConnections()
            'map the columns
            Dim path As IDTSPath90 = dataFlowTask.PathCollection.New()
            path.AttachPathAndPropagateNotifications(source.OutputCollection(0), destination.InputCollection(0))
            Dim input As IDTSInput90 = destination.InputCollection(0)
            Dim vInput As IDTSVirtualInput90 = input.GetVirtualInput()
            Dim vColumn As IDTSVirtualInputColumn90
            For Each vColumn In vInput.VirtualInputColumnCollection
                Dim vCol As IDTSInputColumn90 = destDesignTime.SetUsageType(input.ID, vInput, vColumn.LineageID, DTSUsageType.UT_READONLY)
                Dim exCol As IDTSExternalMetadataColumn90 = input.ExternalMetadataColumnCollection(vColumn.Name)
                destDesignTime.MapInputColumn(input.ID, vCol.ID, input.ExternalMetadataColumnCollection(vColumn.Name).ID)
            Next

            Dim app As Application = New Application()
            Dim strPath As System.String
            strPath = Dts.Variables("ChildPackagePath").Value.ToString & package.Name.ToString & ".dtsx"
            app.SaveToXml(strPath, package, Nothing)

            'Set the value for the return variable to the name of the new package
            Dts.Variables("ChildPackageName").Value = package.Name.ToString & ".dtsx"

             'Run package
            package.Execute()

            'Send success result if no exceptions are raised
            Dts.TaskResult = Dts.Results.Success
        Catch ex As Exception
            'Send failure result if exceptions are raised
            Dts.TaskResult = Dts.Results.Failure
        End Try
    End Sub
End Class

 

posted on 2008-06-08 22:04  敬以直内  阅读(856)  评论(0编辑  收藏  举报

导航