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

标签 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

最佳答案

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

分步过程:

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

  • 希望有帮助。

    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 Main() 方法代码,可以在 SSIS 2005 and above 中使用:
    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:

    截图 #2:

    截图 #3:

    截图 #4:

    截图 #5:

    截图 #6:

    截图 #7:

    截图 #8:

    截图 #9:

    截图 #10:

    截图 #11:

    截图 #12:

    关于vb.net - 使用 SSIS 脚本任务将数据从多个 SQL 表导出到不同的平面文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216486/

    相关文章:

    .net - 无法使用 Visual Basic 将具有 12 位小数的 double /十进制值转换为字符串

    c# - .NET 的 WinForms 的 WindowLicker?

    wpf - 如何获取 WPF DataGrid 的单元格级别 ComboBox?

    c# - 当 AutoGenerateColumns 设置为 True 时,如何停止在 DataGrid 中生成特定列?

    c# - 防止在 DataGridView 控件中选择多个单元格

    c# - 使用 RIGHT JOINT 将两个表连接到一个数据 GridView 中

    vb.net - 如何: Change datagridview LinkColumn Text when clicked

    asp.net - 带有 ASP.Net 的新 Google Recaptcha

    c# - WPF Datagrid 未更新

    c# - DataGridViewComboBox 值无效?