Comment accéder à une variable RecordSet dans une tâche de script?
Sous l'onglet de script, assurez-vous de placer la variable dans les zones de texte readonlyvariables ou readwritevariables.
Voici un script simple que j'utilise pour formater les erreurs dans un flux de données (enregistré dans une variable RecordSet) dans le corps d'un e-mail. Fondamentalement, j'ai lu le jeu d'enregistrements varialbe dans un datatable et l'ai traité ligne par ligne avec les boucles for. Une fois cette tâche terminée, j'examine la valeur de uvErrorEmailNeeded pour déterminer s'il y a quelque chose à envoyer par courrier électronique à l'aide d'un connecteur de flux de processus conditionnel. Vous devrez également ajouter une référence à system.xml dans votre script vb. Ceci est en SQL 2005.
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Xml
Imports System.Data.OleDb
Public Class ScriptMain
Public Sub Main()
Dim oleDA As New OleDbDataAdapter
Dim dt As New DataTable
Dim col As DataColumn
Dim row As DataRow
Dim sMsg As String
Dim sHeader As String
oleDA.Fill(dt, Dts.Variables("uvErrorTable").Value)
If dt.Rows.Count > 0 Then
Dts.Variables("uvErrorEmailNeeded").Value = True
For Each col In dt.Columns
sHeader = sHeader & col.ColumnName & vbTab
Next
sHeader = sHeader & vbCrLf
For Each row In dt.Rows
For Each col In dt.Columns
sMsg = sMsg & row(col.Ordinal).ToString & vbTab
Next
sMsg = sMsg & vbCrLf
Next
Dts.Variables("uvMessageBody").Value = "Error task. Error list follows:" & vbCrLf & sHeader & sMsg & vbCrLf & vbCrLf
End If
Dts.TaskResult = Dts.Results.Success
End Sub
End Class
Ci-dessous figure le code que j'ai utilisé pour charger une date dans une tâche de script C # à partir d'un jeu d'enregistrements ou d'une variable de résultats. "User :: transactionalRepDBs" est une variable SSIS de Object (System.Object) qui a été chargée via un "ensemble de résultats complet" à partir d'un script de tâche d'exécution SQL. Ce lien m'a aidé.
using System.Data.OleDb;
DataTable dt= new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.Fill(dt, Dts.Variables["User::transactionalRepDBs"].Value);
foreach (DataRow row in dt.Rows)
{
//insert what you want to do here
}
Une méthode plus simple que j'ai trouvée (avec C #) consiste simplement à convertir l'objet en un tableau de chaînes. Voici à quoi ressemble mon code C #:
public void Main()
{
string[] arreglo = (string[])Dts.Variables["User::arreglo"].Value;
...
foreach (string elemento in arreglo)
{
// do stuff on each element of the array/collection
}
...
}