2012-12-12 1 views
1

J'ai un scénario dans lequel je dois obtenir des données à partir du fichier inconnu no du fichier Excel et de leur nombre inconnu d'onglets. J'ai donc créé une table avec 50 colonnes. Problème: le paquet ssis ne progresse pas après la deuxième boucle.La première boucle obtient les noms de fichiers et la seconde boucle les noms des onglets dans ce fichier. La DTF dans la deuxième boucle ouvre Excel onglet Fichier et lire les données et écrire à la table de base de données enter image description hereLa tâche de script dans DFT n'est pas exécutée

J'ai créé la variable sperate pour stocker le nom de fichier et le nom de l'onglet récupéré depuis des conteneurs en boucle foreach et les a utilisés dans la tâche DTF. même que la tâche DFT est en train d'être frappé sans aucune erreur.

Intérieur DFT J'ai juste une source de script pour ouvrir le fichier Excel et lire les données, puis le transmettre à la destination oledb. Après avoir écrasé toutes les choses supprimées, effaçant la tâche DFT en boucle maintenant. À l'intérieur de la boucle foreach ci-dessus DFT je place une tâche de script et pop-up un test. MessageBox.Show ("blabla"). et son woriking. Faites maintenant comment?

ci-dessous est le code dans la tâche de script.

public class ScriptMain : UserComponent 
{ 
    private OleDbDataReader excelReader; 
    private OleDbConnection excelConnection; 
    private OleDbCommand excelCommand; 
    public override void PreExecute() 
    { 
     base.PreExecute(); 
     // Open 
     GetDataFromExcelToReader(Variables.IndividualFileNamesForDFT, Variables.IndividualTabNamesForDFT); 
    } 
    public override void PostExecute() 
    { 
     base.PostExecute(); 
     excelReader.Close(); 
     excelConnection.Close(); 
    } 
    private void GetDataFromExcelToReader(string p_strFileName, string p_strTabName) 
    { 
     string l_strConnectionString; 
     if (File.Exists(p_strFileName)) 
     { 
      string extension = Path.GetExtension(p_strFileName); 
      extension = extension.Replace(".", ""); 
      if (extension.ToLower() == "xlsx") 
      { 
       l_strConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + 
       "Data Source=" + p_strFileName + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\";"; 
      } 
      else 
      { 
       l_strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
        "Data Source=" + p_strFileName + ";Extended Properties=\"Excel 4.0;HDR=NO;IMEX=1\";"; 
      } 
      excelConnection = new OleDbConnection(l_strConnectionString); 
      excelConnection.Open(); 
      excelCommand = excelConnection.CreateCommand(); 
      excelCommand.CommandText = "SELECT * FROM [" + p_strTabName + "A1:AX1048576]"; 
      excelCommand.CommandType = CommandType.Text; 
      excelReader = excelCommand.ExecuteReader(); 
     } 
    } 
    public override void CreateNewOutputRows() 
    { 
     int counter = 0; 
     while (excelReader.Read()) 
     { 
       Output0Buffer.AddRow(); 
       Output0Buffer.FileName = Variables.IndividualFileNamesForDFT.ToString(); 
       Output0Buffer.TabName = Variables.IndividualTabNamesForDFT.ToString(); 
       Output0Buffer.Col1 = excelReader.FieldCount > 0 ? excelReader[0].ToString() : null; 
       Output0Buffer.Col2 = excelReader.FieldCount > 1 ? excelReader[1].ToString() : null; 
       Output0Buffer.Col3 = excelReader.FieldCount > 2 ? excelReader[2].ToString() : null; 
       Output0Buffer.Col4 = excelReader.FieldCount > 3 ? excelReader[3].ToString() : null; 
       Output0Buffer.Col5 = excelReader.FieldCount > 4 ? excelReader[4].ToString() : null; 
       Output0Buffer.Col6 = excelReader.FieldCount > 5 ? excelReader[5].ToString() : null; 
       Output0Buffer.Col7 = excelReader.FieldCount > 6 ? excelReader[6].ToString() : null; 
       Output0Buffer.Col8 = excelReader.FieldCount > 7 ? excelReader[7].ToString() : null; 
       Output0Buffer.Col9 = excelReader.FieldCount > 8 ? excelReader[8].ToString() : null; 
       Output0Buffer.Col10 = excelReader.FieldCount > 9 ? excelReader[9].ToString() : null; 
       Output0Buffer.Col11 = excelReader.FieldCount > 10 ? excelReader[10].ToString() : null; 
       Output0Buffer.Col12 = excelReader.FieldCount > 11 ? excelReader[11].ToString() : null; 
       Output0Buffer.Col13 = excelReader.FieldCount > 12 ? excelReader[12].ToString() : null; 
       Output0Buffer.Col14 = excelReader.FieldCount > 13 ? excelReader[13].ToString() : null; 
       Output0Buffer.Col15 = excelReader.FieldCount > 14 ? excelReader[14].ToString() : null; 
       Output0Buffer.Col16 = excelReader.FieldCount > 15 ? excelReader[15].ToString() : null; 
       Output0Buffer.Col17 = excelReader.FieldCount > 16 ? excelReader[16].ToString() : null; 
       Output0Buffer.Col18 = excelReader.FieldCount > 17 ? excelReader[17].ToString() : null; 
       Output0Buffer.Col19 = excelReader.FieldCount > 18 ? excelReader[18].ToString() : null; 
       Output0Buffer.Col20 = excelReader.FieldCount > 19 ? excelReader[19].ToString() : null; 
       Output0Buffer.Col21 = excelReader.FieldCount > 20 ? excelReader[20].ToString() : null; 
       Output0Buffer.Col22 = excelReader.FieldCount > 21 ? excelReader[21].ToString() : null; 
       Output0Buffer.Col23 = excelReader.FieldCount > 22 ? excelReader[22].ToString() : null; 
       Output0Buffer.Col24 = excelReader.FieldCount > 23 ? excelReader[23].ToString() : null; 
       Output0Buffer.Col25 = excelReader.FieldCount > 24 ? excelReader[24].ToString() : null; 
       Output0Buffer.Col26 = excelReader.FieldCount > 25 ? excelReader[25].ToString() : null; 
       Output0Buffer.Col27 = excelReader.FieldCount > 26 ? excelReader[26].ToString() : null; 
       Output0Buffer.Col28 = excelReader.FieldCount > 27 ? excelReader[27].ToString() : null; 
       Output0Buffer.Col29 = excelReader.FieldCount > 28 ? excelReader[28].ToString() : null; 
       Output0Buffer.Col30 = excelReader.FieldCount > 29 ? excelReader[29].ToString() : null; 
       Output0Buffer.Col31 = excelReader.FieldCount > 30 ? excelReader[30].ToString() : null; 
       Output0Buffer.Col32 = excelReader.FieldCount > 31 ? excelReader[31].ToString() : null; 
       Output0Buffer.Col33 = excelReader.FieldCount > 32 ? excelReader[32].ToString() : null; 
       Output0Buffer.Col34 = excelReader.FieldCount > 33 ? excelReader[33].ToString() : null; 
       Output0Buffer.Col35 = excelReader.FieldCount > 34 ? excelReader[34].ToString() : null; 
       Output0Buffer.Col36 = excelReader.FieldCount > 35 ? excelReader[35].ToString() : null; 
       Output0Buffer.Col37 = excelReader.FieldCount > 36 ? excelReader[36].ToString() : null; 
       Output0Buffer.Col38 = excelReader.FieldCount > 37 ? excelReader[37].ToString() : null; 
       Output0Buffer.Col39 = excelReader.FieldCount > 38 ? excelReader[38].ToString() : null; 
       Output0Buffer.Col40 = excelReader.FieldCount > 39 ? excelReader[39].ToString() : null; 
       Output0Buffer.Col41 = excelReader.FieldCount > 40 ? excelReader[40].ToString() : null; 
       Output0Buffer.Col42 = excelReader.FieldCount > 41 ? excelReader[41].ToString() : null; 
       Output0Buffer.Col43 = excelReader.FieldCount > 42 ? excelReader[42].ToString() : null; 
       Output0Buffer.Col44 = excelReader.FieldCount > 43 ? excelReader[43].ToString() : null; 
       Output0Buffer.Col45 = excelReader.FieldCount > 44 ? excelReader[44].ToString() : null; 
       Output0Buffer.Col46 = excelReader.FieldCount > 45 ? excelReader[45].ToString() : null; 
       Output0Buffer.Col47 = excelReader.FieldCount > 46 ? excelReader[46].ToString() : null; 
       Output0Buffer.Col48 = excelReader.FieldCount > 47 ? excelReader[47].ToString() : null; 
       Output0Buffer.Col49 = excelReader.FieldCount > 48 ? excelReader[48].ToString() : null; 
       Output0Buffer.Col50 = excelReader.FieldCount > 49 ? excelReader[49].ToString() : null; 
     } 
    } 
} 
+0

Pouvez-vous publier le code pour le composant de flux de données s'il vous plaît, car il semble que c'est là qu'il se bloque –

+0

@lynamc Salut, j'ai posté du code dans la tâche de script – Gokul

+0

Il serait utile si vous aviez une capture d'écran du paquet. Est-ce que c'est ce que votre diagramme ressemble? [Foreach Loop Container (Enumérateur de fichiers) pour récupérer une liste de noms de fichiers de documents Excel] -> [Foreach Loop Container (Item/ADO Enumerator) pour parcourir la liste et pour chaque document Excel essaie d'obtenir le nom de l'onglet]. Votre code s'exécute dans le deuxième conteneur Foreach? – booyaa

Répondre

0

@ Ciarán - merci, inseted de sélectionner une plage spécifique en ouvrant juste l'onglet complet résolu mon problème. "SELECT * FROM [" + p_strTabName + "]"

2

Avez-vous vraiment besoin de lire A1: AX1048576? Est-ce qu'il gère cela et ne lit que ce dont il a besoin?

Pouvez-vous essayer de lire uniquement les parties du fichier Excel dont vous avez besoin? Par exemple, si vous avez un fichier Excel avec 10 colonnes et 400 lignes, essayez de lire A1: Z9999 - vous vous demandez si la tâche de script est juste ratée, puis trashing sur le disque puisque le résultat est assez énorme.

+1

Oui, je suis enclin à être d'accord avec Cairnz. En fait, où n'est pas nécessaire de spécifier la plage du tout. Vous pouvez simplement dire "SELECT * FROM [" + p_strTabName + "]" –

+0

car je ne sais pas le nombre de lignes que j'ai factorisées toutes les lignes. Mais ce n'est pas le problème. même après avoir limité les lignes à 100, il ne traite toujours pas – Gokul

+0

Oh et aussi, juste comme un intérêt. Il n'est pas nécessaire de référencer Microsoft.Jet.OLEDB.4.0 car le fournisseur Microsoft.ACE.OLEDB.12.0 lira très bien le fichier xls. Mais cela ne vous cause pas le problème. J'évite les composants de script car ils ne peuvent pas être débogués. Vous pouvez cependant afficher des messages de débogage dans les boîtes de message pour voir où il est suspendu. –

Questions connexes