白开心

  IT博客 :: 首页 ::  :: 联系 :: 聚合  :: 管理 ::
  9 随笔 :: 76 文章 :: 28 评论 :: 0 Trackbacks

本测试程序主要使用到:
1.脚本访问全局变量
2.使用脚本做为SSIS输出数据源
3.FOREACH循环容器遍历文件
以下过程可以实现DBF数据表或者其他源导入到 SQL SERVER 目标中。


在控制流中,做以下步骤
1.点空白位置,菜单SSIS->变量,新增两个属于 Package 包的变量,varConnstr和varFileName。
     varConnstr = "数据库链接字符串"
2.设置一个 Foreach 容器,点编辑。
     a.在集合设置中,Enumerator 选择 Foreach 文件枚举器
     b.在文件夹中,选择你存放数据源文件的目录
     c.文件Textbox,输入要查找的过滤文件名。
     d.变量映射集合中,选择"varFileName",索引是0
3.添加一个数据流任务到 Foreach 容器中,双击数据流任务,转向该数据流任务设计界面。
4.添加一个脚本组件,选择做为输出源,点编辑。
    a.在输入和输出设置中,设置输出名:OutputObject,添加2个输出列:ID  和 KindName,设置对应的数据类型值。
    b.脚本设置中(这里是比较关键注意的地方),在ReadOnlyVariables属性中输入全局变量的名称,多个以","隔开,例如: varFileName,varConnstr,这样在你的脚本代码中就能访问到全局变量的值了。
    c.点设计脚本。参考以下代码:
 

' Microsoft SQL Server Integration Services user script component
'
 This is your new script component in Microsoft Visual Basic .NET
'
 ScriptMain is the entrypoint class for script components

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

Public Class ScriptMain
    
Inherits UserComponent

    
'Test BY HJ 2009-10-20
    Public Overrides Sub CreateNewOutputRows()
        
'
        ' Add rows by calling AddRow method on member variable called "<Output Name>Buffer"
        ' E.g., MyOutputBuffer.AddRow() if your output was named "My Output"
        '

        
'访问 FoxPro 数据库,需要下载驱动
        '下载网址 http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en
        'Dim Connstr As String
        'Connstr = "Provider=VFPOLEDB.1;Data Source=E:\NET3.5代码学习\BI学习\DBF\accountsA.dbf;"
        'Dim Conn As New Data.OleDb.OleDbConnection
        'Conn.ConnectionString = Connstr
        'Try
        '    Conn.Open()
        '    Dim Cmd As New Data.OleDb.OleDbCommand
        '    Cmd.CommandText = "Select * from accountsA"
        '    Cmd.Connection = Conn
        '    Dim Adp As New Data.OleDb.OleDbDataAdapter(Cmd)
        '    Dim Ds As New Data.DataSet
        '    Adp.Fill(Ds)
        '    Dim i As Integer
        '    For i = 0 To Ds.Tables(0).Rows.Count
        '        Console.WriteLine(Ds.Tables(0).Rows(i)(1).ToString())
        '    Next i
        'Catch ex As Exception
        '    Console.WriteLine(ex.Message.ToString())
        'Finally
        '    Conn.Close()
        'End Try

        
'accountsA.dbf,accountsB.dbf,accountsC.dbf是我循环遍历文件夹中的文件名
        '这里为了测试中不插入重复键,以文件名不同,输入ID值不同
        Dim fileName As String
        
Dim startIndex As Integer
        fileName 
= System.IO.Path.GetFileName(Me.ReadOnlyVariables("varFileName").Value.ToString())
        
If fileName = "accountsA.dbf" Then
            startIndex 
= 1
        
ElseIf fileName = "accountsB.dbf" Then
            startIndex 
= 10
        
ElseIf fileName = "accountsC.dbf" Then
            startIndex 
= 20
        
Else
            startIndex 
= 100
        
End If

        
'添加了6个输出行
        Me.OutputObjectBuffer.AddRow()
        
Me.OutputObjectBuffer.ID = startIndex
        
Me.OutputObjectBuffer.KindName = "HJ"
        startIndex 
= startIndex + 1

        
Me.OutputObjectBuffer.AddRow()
        
Me.OutputObjectBuffer.ID = startIndex
        
Me.OutputObjectBuffer.KindName = "HK"
        startIndex 
= startIndex + 1

        
Me.OutputObjectBuffer.AddRow()
        
Me.OutputObjectBuffer.ID = startIndex
        
Me.OutputObjectBuffer.KindName = "GZ"
        startIndex 
= startIndex + 1

        
Me.OutputObjectBuffer.AddRow()
        
Me.OutputObjectBuffer.ID = startIndex
        
Me.OutputObjectBuffer.KindName = System.IO.Path.GetFileName(Me.ReadOnlyVariables("varFileName").Value.ToString())
        startIndex 
= startIndex + 1

        
Me.OutputObjectBuffer.AddRow()
        
Me.OutputObjectBuffer.ID = startIndex
        
Me.OutputObjectBuffer.KindName = System.IO.Path.GetFileName(Me.ReadOnlyVariables("varConnstr").Value.ToString())
        startIndex 
= startIndex + 1

        
Me.OutputObjectBuffer.AddRow()
        
Me.OutputObjectBuffer.ID = startIndex
        
Me.OutputObjectBuffer.KindName = GetDataInfo()
    
End Sub


    
'测试是否可以访问 SQL 数据库
    Private Function GetDataInfo() As String
        
Dim Conn As New Data.SqlClient.SqlConnection
        
Dim Cmd As New SqlClient.SqlCommand
        
Try
            Conn.ConnectionString 
= Me.ReadOnlyVariables("varConnstr").Value.ToString()
            Conn.Open()
            Cmd.Connection 
= Conn
            Cmd.CommandText 
= "Select Count(1) from sysobjects"
            
Return Cmd.ExecuteScalar().ToString()
        
Catch ex As Exception
            
Return ex.Message
        
Finally
            Conn.Close()
        
End Try
    
End Function



End Class



      d.可以添加数据转换和OLEDB目标了,链接到脚本组件数据源。
posted on 2009-10-21 00:22 白开心 阅读(1541) 评论(0)  编辑 收藏 引用 所属分类: .Net(学习ing...)
只有注册用户登录后才能发表评论。