【问题标题】:Determine if file is empty (SSIS)确定文件是否为空 (SSIS)
【发布时间】:2011-02-24 13:42:11
【问题描述】:

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

【问题讨论】:

    标签: sql-server-2005 ssis


    【解决方案1】:

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

    双击数据流任务并添加一个平面文件源和行计数项。

    在行计数属性中,创建一个行计数变量。

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

    【讨论】:

      【解决方案2】:

      有两种方法:

      如果文件为空意味着 size = 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
      

      否则,如果文件为空意味着没有行(平面文件),您可以在读取文件后使用行计数转换。您可以使用行计数编辑器中的“变量名称”属性从行计数设置变量并将其用作状态。

      【讨论】:

        【解决方案3】:

        使用以下代码(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,则接受答案需要很长时间才能运行,这个解决方案可以在几秒钟内运行。

        【讨论】:

          【解决方案4】:

          是的,脚本任务将在此处完成工作。在脚本顶部添加 using 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
          

          【讨论】:

          • 与下面使用“行数”项的解决方案相比,编写脚本似乎过于复杂。
          • 我应该在哪里添加脚本?一张图片图表将对此非常有帮助。谢谢:)
          猜你喜欢
          • 2021-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-15
          • 1970-01-01
          • 1970-01-01
          • 2022-06-22
          相关资源
          最近更新 更多