Экспорт данных из нескольких таблиц SQL в разные плоские файлы с помощью задачи сценария служб SSIS - PullRequest
4 голосов
/ 02 июня 2011

Я пытаюсь создать сетку данных и экспортировать содержимое в текстовый файл, используя 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 ]

11 голосов
/ 02 июня 2011

Вот возможный способ экспорта таблиц различной структуры в плоский файл, используя Script Task.В этом примере будут экспортированы две таблицы, содержащие разные поля и данные, в плоский файл с помощью задачи «Сценарий».Чтобы экспортировать данные, вы можете использовать DataReader вместо DataGrid.Могут быть и другие возможные способы сделать это.

Пошаговый процесс:

  1. Создайте три таблицы с именами dbo.TablesList, dbo.Source1 и dbo.Source2, используя сценарии, указанные в SQL Scripts section.
  2. Заполните таблицы dbo.TablesList, dbo.Source1 и `dbo.Source2`` данными, показанными на скриншоте # 1 .
  3. В пакете служб SSIS Connection manager создайте OLE DB connection с именем SQLServer для подключения к экземпляру SQL Server, как показано на снимке экрана # 2 .
  4. Впакет, создайте 4 переменные, как показано на скриншоте # 3 .
  5. В потоке управления поместите Execute SQL Task, Foreach Loop Container и Script Task в Foreach loop container какпоказано на скриншоте # 4 .
  6. Сконфигурируйте Execute SQL task как показано на скриншотах # 5 и # 6 .
  7. Настройте Foreach Loop container, как показано на скриншотах # 7 и # 8 .
  8. Замените метод Main в задаче сценария на код, указанный в разделе Script Task Code.
  9. Снимок экрана # 9 sВыполнение пакета hows.
  10. Снимки экрана # 10 - # 12 показывают файлы, экспортированные из SSIS с использованием кода задачи скрипта.

Надеюсь, чтоhelp.

Сценарии 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:

1

Снимок экрана № 2:

2

Снимок экрана# 3:

3

Снимок экрана № 4:

4

Снимок экрана# 5:

5

Снимок экрана № 6:

6

Снимок экрана# 7:

7

Снимок экрана № 8:

8

Снимок экрана# 9:

9

Снимок экрана # 10:

10

Снимок экрана № 11:

11

Снимок экрана № 12:

12

0 голосов
/ 02 июня 2011

Почему бы вам не использовать исходный компонент OLEDB, поместить туда табличный запрос и затем вывести его в средство записи плоских файлов в SSIS вместо использования компонента сценария? В этом блоге показано, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...