2012-12-12 6 views
1

나는 알 수없는 파일을 Excel에서 가져올 수있는 시나리오가 있으며 알 수없는 탭이 없습니다. 그래서 나는 50 개의 열이있는 테이블을 만들었습니다. enter image description hereDFT에서 스크립트 작업이 수행되지 않습니다.

문제는 ssis 패키지가 두 번째 루프가 된 후 진행되지 않습니다. 첫 번째 루프는 파일 이름을 가져오고 두 번째 루프는 해당 파일에서 탭 이름을 가져옵니다. 두 번째 루프의 DTF가 파일 탭을 열고 데이터를 읽고 데이터베이스 테이블에 씁니다. enter image description here

foreach 루프 컨테이너에서 얻은 파일 이름과 탭 이름을 저장하기 위해 sperate 변수를 만들어 DTF 작업에 사용했습니다. 심지어 DFT 작업보다 오류가 발생했습니다.

DFT의 내부에는 파일을 열고 파일을 읽은 다음 oledb 대상에 전달하는 스크립트 소스가 있습니다. enter image description here

tyring 후에 모든 유휴 물건 suppringly 루프 DFT 작업 prosessed. DFT 위의 foreach 루프 내부에서 스크립트 작업을 배치하고 테스트를 시작했습니다. MessageBox.Show ("blabla"). 그리고 그 woriking. 어떻게 해?

아래 스크립트 작업의 코드입니다.

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

데이터 흐름 스크립트 구성 요소의 코드를 붙여 넣을 수 있습니까? 여기가 멈추고있는 것처럼 보입니다. –

+0

@lynamc 안녕하세요, 스크립트 작업에 코드를 게시했습니다. – Gokul

+0

패키지의 스크린 샷이 있으면 도움이됩니다. 이것이 귀하의 다이어그램이 보이는 것입니까? [Foreach 루프 컨테이너 (파일 열거 자)를 사용하여 Excel 문서 파일 이름 목록 가져 오기] -> [Foreach 루프 컨테이너 (항목/ADO 열거 자) 목록을 통과하고 각 Excel 문서에 대해 탭/워크 시트 이름 가져 오기]. 코드가 두 번째 Foreach 컨테이너에서 실행됩니까? – booyaa

답변

0

@ Ciarán - 감사합니다, 삽입 된 특정 탭을 열면 특정 탭을 열면 내 문제가 해결됩니다. "SELECT * FROM ["+ p_strTabName + "]"

2

정말로 A1 : AX1048576을 읽어야합니까? 이 문제를 처리하고 필요한 부분 만 읽습니까?

필요한 Excel 파일의 일부분 만 읽을 수 있습니까? 예를 들어 10 열 400 행의 Excel 파일이있는 경우 A1 : Z9999를 읽으십시오. 스크립트 작업이 모든 것을 메모리에 넣으려고 시도하는 경우 궁금해하고 결과 세트가 꽤 큽니다.

+1

예, 저는 cairnz에 동의하는 경향이 있습니다. 실제로 범위를 지정하지 않아도됩니다. 간단히 말해서 "SELECT * FROM ["+ p_strTabName + "]" –

+0

을 말할 수 있습니다. 왜냐하면 나는 모든 행을 고려하지 않았기 때문입니다. 하지만 그게 문제가 아니야. 심지어 행을 100으로 제한 한 후에도 여전히 처리되지 않습니다. – Gokul

+0

아 또한 흥미로운 문제입니다. Microsoft.ACE.OLEDB.12.0 공급자가 xls 파일을 잘 읽으므로 Microsoft.Jet.OLEDB.4.0을 참조 할 필요가 없습니다. 하지만 이것이 문제의 원인이 아닙니다. 스크립트 구성 요소는 디버깅 할 수 없으므로 사용하지 마십시오. 그러나 메시지 상자에 디버그 메시지를 표시하여 메시지가 걸려있는 위치를 확인할 수 있습니다. –

관련 문제