2011-02-24 167 views
4

我想在SSIS 2005中開發一個包,我的部分流程是檢查網絡上的文件是否爲空。如果它不是空的,我需要傳遞一個成功的狀態,否則,我需要傳遞一個不成功的狀態。我想我需要一個腳本任務,但不知道如何去做。任何幫助表示讚賞。確定文件是否爲空(SSIS)

回答

0

是的,腳本任務將在這裏完成這項工作。將一個使用的System.IO語句添加到腳本的頂部,然後在Main方法中沿着以下幾行的內容檢查文件的內容。

 public void Main() 
    { 
     String FilePath = Dts.Variables["User::FilePath"].Value.ToString(); 

     String strContents; 
     StreamReader sReader; 
     sReader = File.OpenText(FilePath); 
     strContents = sReader.ReadToEnd(); 
     sReader.Close(); 
     if (strContents.Length==0) 
      MessageBox.Show("Empty file"); 

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 

編輯:VB.Net版本2005 ...

Public Sub Main() 

    Dim FilePath As String = Dts.Variables("User::FilePath").Value.ToString() 
    Dim strContents As String 
    Dim sReader As StreamReader 

    sReader = File.OpenText(FilePath) 
    strContents = sReader.ReadToEnd() 
    sReader.Close() 
    If strContents.Length = 0 Then 
     MessageBox.Show("Empty file") 
    End If 

    Dts.TaskResult = ScriptResults.Success 
End Sub 
+0

這很好。謝謝! – DoubleJ92 2011-02-24 20:14:08

+0

與使用「行計數」項目的解決方案相比,編寫腳本看起來過於複雜。 – 2014-01-14 01:08:51

+0

我應該在哪裏添加腳本?圖片圖對此會非常有幫助。謝謝 :) – Si8 2014-04-04 14:01:49

11

創建的連接管理器面板的平面文件的連接。 在控制流選項卡下,添加數據流任務。 enter image description here

雙擊數據流任務並添加平面文件來源和行計數項目。 enter image description here

在行計數屬性中,創建一個RowCount變量。 enter image description here

在Control Flow選項卡中,根據@RowCount的結果創建控制流連接。 enter image description here

2

有兩種方法可以做到這一點:

如果文件空手段大小= 0,你可以創建一個腳本任務做檢查: http://msdn.microsoft.com/en-us/library/ms345166.aspx

If My.Computer.FileSystem.FileExists("c:\myfile.txt") Then 

    Dim myFileInfo As System.IO.FileInfo 
    myFileInfo = My.Computer.FileSystem.GetFileInfo("c:\myfile.txt") 

    If myFileInfo.Length = 0 Then 
    Dts.Variables["Status"].Value = 0 
    End If 
End If 

否則,如果文件爲空表示沒有行(平面文件),您可以在讀取文件後使用行計數轉換。您可以使用行計數編輯器中的'VariableName'屬性從行計數中設置一個變量,並將其用作狀態。

0

添加一個簡單的腳本任務用下面的代碼(C#)應該做的伎倆:

String FilePath = (string)Dts.Variables["User::FilePath"].Value; 

var length = new System.IO.FileInfo(FilePath).Length; 

if (length == 0) 
    Dts.TaskResult = (int)ScriptResults.Success; 
else 
    Dts.TaskResult = (int)ScriptResults.Failure; 

此選項將運行很多比接受的答案更快,因爲它並不需要讀取整個文件,如果你正在循環訪問一個文件夾,其中一些文件很大,在我的情況下~800mb,接受的答案需要很長時間才能運行,這個解決方案在幾秒鐘內運行。