4 votes

Exportation des données de plusieurs tables SQL vers différents fichiers plats à l'aide de la tâche SSIS script.

J'essaie de créer une grille de données et d'exporter son contenu vers un fichier texte en utilisant VB.NET et je fais cela à l'intérieur d'une tâche SSIS script afin d'automatiser le processus d'exportation d'une table dynamique vers un fichier texte. Je n'obtiens aucune erreur et les fichiers sont créés mais les fichiers sont vides.

Qu'est-ce que je fais de mal ici dans ce code ?

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

11voto

Voici une façon possible d'exporter les tables de différentes structures vers un fichier plat en utilisant Script Task . Cet exemple va exporter deux tables contenant différents champs et données vers un fichier plat en utilisant script Task. Afin d'exporter les données, vous pouvez utiliser la fonction DataReader au lieu d'utiliser le DataGrid . Il pourrait y avoir d'autres façons de procéder.

Processus étape par étape :

  1. Créez trois tables nommées dbo.TablesList , dbo.Source1 y dbo.Source2 en utilisant les scripts donnés sous SQL scripts section.
  2. Remplir les tableaux dbo.TablesList , dbo.Source1 et `dbo.Source2`` avec les données montrées dans la capture d'écran #. 1 .
  3. Dans l'onglet Connection manager créer un OLE DB connection nommé SQLServer pour se connecter à l'instance de SQL Server comme indiqué dans la capture d'écran #. 2 .
  4. Dans le paquet, créez 4 variables comme indiqué dans la capture d'écran #. 3 .
  5. Dans le flux de contrôle, placez un Execute SQL Task , a Foreach Loop Container y un Script Task au sein de la Foreach loop container comme indiqué dans la capture d'écran #. 4 .
  6. Configurer le Execute SQL task comme indiqué dans les captures d'écran #. 5 et # 6 .
  7. Configurer le Foreach Loop container comme indiqué dans les captures d'écran suivantes 7 et # 8 .
  8. Remplacer la méthode Main à l'intérieur de la tâche script par le code donné sous la section Script Task Code .
  9. Capture d'écran # 9 montre l'exécution du paquet.
  10. Screenshots # 10 - # 12 montrer les fichiers exportés depuis SSIS en utilisant le code de la tâche script.

J'espère que cela vous aidera.

SQL scripts :

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

script Code de tâche : (Utilisez le code donné ci-dessous pour remplacer la méthode Main() dans votre tâche script)

VB Code de la méthode Main() qui peut être utilisée dans 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

Capture d'écran n° 1 :

1

Capture d'écran n°2 :

2

Capture d'écran n°3 :

3

Capture d'écran n°4 :

4

Capture d'écran n°5 :

5

Capture d'écran n°6 :

6

Capture d'écran n°7 :

7

Capture d'écran n°8 :

8

Capture d'écran n°9 :

9

Capture d'écran n°10 :

10

Capture d'écran n° 11 :

11

Capture d'écran n°12 :

12

0voto

Tom Pickles Points 885

Pourquoi n'utilisez-vous pas un composant source OLEDB, n'y placez-vous pas votre requête de table et ne la transmettez-vous pas à un rédacteur de fichier plat dans SSIS au lieu d'utiliser un composant script ? Cet article de blog illustre comment procéder.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X