确定文件是否为空(SSIS)

时间:2011-02-24 13:42:12

标签: sql-server-2005 ssis

我正在尝试在SSIS 2005中开发一个包,我的部分过程是检查网络上的文件是否为空。如果它不是空的,我需要传递成功的状态,否则,我需要传递一个不成功的状态。我想我需要一个脚本任务,但我不确定如何去做。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:11)

在“连接管理器”面板中创建与平面文件的连接。 在“控制流”选项卡下,添加“数据流任务”。 enter image description here

双击“数据流”任务,然后添加“平面文件源”和“行计数”项。 enter image description here

在“行计数”属性中,创建一个RowCount变量。 enter image description here

在“控制流”选项卡中,根据@RowCount的结果创建控制流连接。 enter image description here

答案 1 :(得分: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'属性从行计数中设置变量,并将其用作状态。

答案 2 :(得分: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;
    }

编辑:2005年的VB.Net版本......

    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

答案 3 :(得分: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,接受答案需要很长时间才能运行,这个解决方案可以在几秒钟内运行。