使用SSIS脚本任务将数据从多个SQL表导出到不同的平面文件

时间:2011-06-02 15:14:05

标签: vb.net datagrid datagridview ssis

我正在尝试使用VB.NET创建数据网格并将内容导出到文本文件,我在SSIS脚本任务中执行此操作,以便自动执行将动态表格导出到文本文件的过程。我没有收到任何错误,文件已创建,但文件为空。

我在这段代码中做错了什么?

Public Sub Main()

    Dim FName As String = "D:\test.TXT"

    ''''''''''''''''''''''''''''''''''''''''''
    If File.Exists(FName) Then
        File.Delete(FName)
    End If
    ''''''''''''''''''''''''''''''''''''''''''

    Dim myConnection As OleDbConnection = New OleDbConnection("Data Source=localhost;Provider=SQLNCLI10;Initial Catalog=AdventureWorksDW2008R2;Integrated Security=SSPI;")
    Dim da As OleDbDataAdapter = New OleDbDataAdapter("Select * from Table")
    Dim ds As DataSet = New DataSet

    da.Fill(ds, "Test")

    Dim DataGrid1 As New DataGrid
    DataGrid1.DataSource = ds.DefaultViewManager
    Dim DataGridView1 As New DataGridView

    DataGridView1.DataSource = ds

    Dim dgvc As DataGridViewCell
    Dim sw As New System.IO.StreamWriter(FName)

    For Each dgvr As DataGridViewRow In DataGridView1.Rows

        Dim intCellCount As Integer = dgvr.Cells.Count
        Dim intCounter As Integer = 1

        For Each dgvc In dgvr.Cells()
            If intCounter <> intCellCount Then
                sw.Write(dgvc.Value.ToString & "|")
            Else
                sw.WriteLine(dgvc.Value.ToString)
            End If

            intCounter += 1
        Next
    Next

    Dts.TaskResult = ScriptResults.Success

End Sub

2 个答案:

答案 0 :(得分:11)

这是使用Script Task将不同结构的表导出到平面文件的可能方法。此示例将使用“脚本任务”将包含不同字段和数据的两个表导出到平面文件。要导出数据,您可以使用DataReader而不是DataGrid。可能有其他可能的方法来做到这一点。

分步流程:

  1. 使用 SQL Scripts 部分下提供的脚本创建名为dbo.TablesListdbo.Source1dbo.Source2的三个表。
  2. 使用屏幕截图# 1 中显示的数据填充表格dbo.TablesListdbo.Source1和`dbo.Source2``。
  3. 在SSIS包的Connection manager上,创建一个名为 SQLServer OLE DB connection以连接到SQL Server实例,如屏幕截图# 2 所示。
  4. 在包中,创建4个变量,如屏幕截图# 3
  5. 所示
  6. 在控制流程中,在Execute SQL Task中放置Foreach Loop ContainerScript TaskForeach loop container,如屏幕截图# 4 所示。
  7. 配置Execute SQL task,如屏幕截图# 5 和# 6 所示。
  8. 配置Foreach Loop container,如屏幕截图# 7 和# 8 所示。
  9. 使用Script Task Code
  10. 部分中给出的代码替换脚本任务中的Main方法
  11. 屏幕截图# 9 显示包执行。
  12. 屏幕截图# 10 - # 12 显示使用脚本任务代码从SSIS导出的文件。
  13. 希望有所帮助。

    SQL脚本:

    CREATE TABLE [dbo].[Source1](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ItemNumber] [varchar](20) NOT NULL,
        [ItemName] [varchar](50) NOT NULL,
    CONSTRAINT [PK_Source1] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[Source2](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [Country] [varchar](20) NOT NULL,
        [StateProvince] [varchar](50) NOT NULL,
    CONSTRAINT [PK_Source2] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[TablesList](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [TableName] [varchar](50) NOT NULL,
        [FilePath] [varchar](255) NOT NULL,
    CONSTRAINT [PK_Tables] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
    GO
    

    脚本任务代码:(使用下面给出的代码替换脚本任务中的Main()方法)

    VB 可在 SSIS 2005 and above 中使用的Main()方法代码:

    Public Sub Main()
    
        Dim varCollection As Variables = Nothing
    
        Dts.VariableDispenser.LockForRead("User::TableName")
        Dts.VariableDispenser.LockForRead("User::FileName")
        Dts.VariableDispenser.LockForRead("User::Delimiter")
        Dts.VariableDispenser.GetVariables(varCollection)
    
        Dim fileName As String = varCollection("User::FileName").Value.ToString()
        Dim query As String = "SELECT * FROM " & varCollection("User::TableName").Value.ToString()
        Dim delimiter As String = varCollection("User::Delimiter").Value.ToString()
    
        Dim writer As StreamWriter = Nothing
        Dim connection As OleDbConnection = New OleDbConnection(Dts.Connections("SQLServer").ConnectionString)
        Dim command As OleDbCommand = Nothing
        Dim reader As OleDbDataReader = Nothing
    
        Try
            If File.Exists(fileName) Then
                File.Delete(fileName)
            End If
    
            connection.Open()
            command = New OleDbCommand(query, connection)
            reader = command.ExecuteReader()
    
            If reader.HasRows Then
    
                writer = New System.IO.StreamWriter(fileName)
                Dim row As Integer = 0
                While reader.Read()
    
                    Dim header As Integer = 0
                    Dim counter As Integer = 0
                    Dim fieldCount As Integer = reader.FieldCount - 1
    
                    If row = 0 Then
                        While header <= fieldCount
                            If header <> fieldCount Then
                                writer.Write(reader.GetName(header).ToString() & delimiter)
                            Else
                                writer.WriteLine(reader.GetName(header).ToString())
                            End If
                            header += 1
                        End While
                    End If
    
                    While counter <= fieldCount
                        If counter <> fieldCount Then
                            writer.Write(reader(counter).ToString() & delimiter)
                        Else
                            writer.WriteLine(reader(counter).ToString())
                        End If
                        counter += 1
                    End While
    
                    row += 1
                End While
            End If
        Catch ex As Exception
            Throw ex
        Finally
            connection.Close()
            writer.Close()
        End Try
    
        Dts.TaskResult = ScriptResults.Success
    
    End Sub
    

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

    屏幕截图#11:

    11

    屏幕截图#12:

    12

答案 1 :(得分:0)

为什么不使用OLEDB源组件,将表查询放在那里,然后将其输出到SSIS中的平面文件编写器而不是使用脚本组件? This blog post说明了如何执行此操作。