SSIS Tâche de Script Obtenez les Noms de Fichiers et de les Stocker pour une SSIS Variable d'Objet
Je suis en train de construire un package SSIS qui sera utilisé dans un fichier normalisé système de processus d'archivage. En gros, je vais être en mesure d'ajouter des informations à une table de configuration, puis utiliser cette table pour archiver certains fichiers dans des dossiers spécifiques. Mon problème est que beaucoup de fichiers ont le nommage dynamique donc j'ai besoin d'obtenir une liste de tous les fichiers, puis de requête pour décider quels fichiers je dois toucher.
N'étant pas un C#/VB programmeur est de me causer des problèmes en essayant de script, une partie du paquet le saisit tous les fichiers dans un répertoire réseau et à donner les noms de ces fichiers en arrière dans un package SSIS variable objet.
J'ai une variable de chaîne 'Utilisateur::SourceNetworkFolderName' qui contiendra l'emplacement UNC du dossier que je veux lire tous les fichiers. Je veux, puis passer tous ces noms de fichiers (avec l'extension) à un objet SSIS variable appelée 'Utilisateur::SourceFilesInTheDirectory'. Une fois que j'ai la liste des noms de fichier dans la variable d'objet, j'allais à la boucle foreach dans une table SQL.
Quelqu'un at-il des suggestions particulières sur la façon dont je obtenir une liste de tous les noms de fichiers à partir de ma variable répertoire de mon SSIS variable d'objet?
Vous en remercie d'avance!
EDIT:
Voici mon code mis à jour:
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
using System.Collections.Generic;
using System.Data.SqlClient;
namespace ST_f5e4ae71f14d40d8811af21fa2a9a622.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
public void Main()
{
//Setup Connection String to SQL
SqlConnection SQLConnection = new SqlConnection(
//"user id=username;" + //UserName
//"password=password;" + //Password
"Trusted_Connection=true;" + //Windows Auth
"server=SERVERNAME;" + //SQL Server
"database=DATABASENAME; " + //SQL Database
"connection timeout=30;" + //connection timeout
"Network Library=dbmssocn"); //TCP/IP Connection ("dbnmpntw" = Name Pipes)
//Open the SQL Connection and remove the error code
try
{
SQLConnection.Open();
}
catch (Exception OpenConnectionError)
{
Console.WriteLine(OpenConnectionError.ToString());
}
//Fetch a list of files from 'SourceNetworkFolderName' SSIS variable to an array called array1.
string[] ArrayFileName = Directory.GetFiles(Dts.Variables["SourceNetworkFolderName"].Value.ToString());
//Set up sql variable for table population
SqlParameter SQLFileNameParam = new SqlParameter("@FileName", SqlDbType.VarChar, 100);
//Loop through the array and insert into an SQL table
foreach (string strFileName in ArrayFileName)
{
//Update sql variable with file names from array
SQLFileNameParam.Value = strFileName;
//Make the table insert
SqlCommand SQLInsertToTable = new SqlCommand("INSERT INTO Archive_Extract_Network_Folder_File_List (FileName) VALUES (@FileName)", SQLConnection);
//This snippit allows the use of the variable in the sql script.
SQLInsertToTable.Parameters.Add(SQLFileNameParam);
//Execute SqlCommand
SQLInsertToTable.ExecuteNonQuery();
//Clear the parameters and set the object to null
SQLInsertToTable.Parameters.Clear();
SQLInsertToTable = null;
}
//Close the SQL Connection and remove the error code
try
{
SQLConnection.Close();
}
catch (Exception CloseConnectionError)
{
Console.WriteLine(CloseConnectionError.ToString());
}
//Set array to null since it is no longer required.
ArrayFileName = null;
//Exit on success
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}
OriginalL'auteur Joe | 2012-08-01
Vous devez vous connecter pour publier un commentaire.
À l'intérieur de votre script, il suffit de construire un tableau des noms de fichier et de l'ensemble de ce tableau à votre variable (assurez-vous que la variable est définie à l'écriture dans le script de la tâche). Si la variable est de type objet que vous pouvez ensuite effectuer une itération à l'aide d'une boucle for dans une tâche ultérieure et faire ce que vous voulez avec les fichiers. Vous ne devriez pas avoir besoin de travailler sur des miracles uniquement dans un script.
Mettre tous les fichiers dans votre source dir dans un Tableau:
Mettre tous les fichiers avec une extension "BIN" dans un tableau:
Vous pourriez avoir besoin d'inclure
System.IO
en haut de votre code de script.MODIFIER:
Pour convertir un tableau à une Liste de traitement par la Boucle de la tâche. Après avoir appelé le code ci-dessus, composez ceci:
Vous aurez besoin d'inclure
System.Collections.Generic
en haut de votre fichier de script.Je me sens super proche, mais actuellement je reçois de débogage des erreurs lorsque vous essayez d'exécuter cette variable comme un ADO Foreach agent Recenseur. Toutes les idées sur la façon d'obtenir cette variable de type correct de sorte que je peux l'utiliser dans un Foreach agent Recenseur? J'ai collé mon code ci-dessous:
code public void Main() { //Fetch a list of files from 'SourceNetworkFolderName' SSIS variable to an array string[] array1 = Directory.GetFiles(Dts.Variables["SourceNetworkFolderName"].Value.ToString()); //Populate the SSIS object variable 'SourceFilesInTheDirectory' with all the file names from the array Dts.Variables["SourceFilesInTheDirectory"].Value = array1; Dts.TaskResult = (int)ScriptResults.Success; }
J'ai édité ma réponse pour le rendre plus facile à lire. La prochaine fois, jeter votre code dans votre question, Il est beaucoup plus facile pour moi de le lire. Viens de faire la dernière étape de la conversion de votre tableau à une Liste et vous devriez être bon d'aller.
Merci encore pour la réponse rapide, mais je suis toujours pas à obtenir le résultat attendu de l'exécution du package. Le code mis à jour, je travaille avec dans est monté dans ma question. En debug, je montre mon ADO énumérateur variable comme Valeur = {Système.Les Collections.Génériques.Liste
1[System.String]} and the Type = List
1. L'erreur renvoyée à la SSIS débogueur est sur la Boucle Foreach est: Erreur: 0 x 3 à Envoyer les Noms de Fichiers À la Table: Variable "Utilisateur::SourceFilesInTheDirectory" ne contient pas de données valides objet je suis désolé, je suis aux prises avec ce!OriginalL'auteur MystikSpiral