调用目标抛出了异常。 ssis脚本任务

时间:2016-09-02 06:49:52

标签: exception sql-server-2012

我在脚本任务中添加了外部dll文件。当我调试脚本任务时代码正在工作,但是当我直接执行SSIS包而没有调试时代码不起作用。所以我得到了异常被调用的目标抛出了。 ssis 错误。任何人都可以解决这个问题。我在GAC中注册了dll并重新启动了机器。但它仍然给我这个错误

1 个答案:

答案 0 :(得分:0)

我很难找到解决这个问题的方法(没有解决方案的问题已经在这里发布了至少几次)。它与读取某些DBF时在.NET中爆炸的VFP OLEDB数据提供商有关。

显然,问题源于VFP允许您从小数点右侧获取数字并在左侧使用它们的方式。例如,如果列定义为N(5,3),则它应该只保存最大为9.999的数字,但如果您不需要小数点右侧的所有三个小数位,则可以使用该空格留下左边的数字。所以这个专栏将保持999.9!无论如何,它会抛出InvalidOperationException。这可以防止您使用DataAdapter的Fill()方法来读取数据。解决方法是使用数据读取器,从头开始构建DataTable并在每行中一次填充一列。发生异常时,为值插入null。这是一些C#2.0代码:

public DataTable GetVfpDataTable(string dbfFullPath)
{
  string sqlString = "SELECT * FROM " + Path.GetFileName(dbfFullPath);
  OleDbConnection oleConn = new OleDbConnection("Provider=VFPOLEDB.1;Data Source=" +
      Path.GetDirectoryName(dbfFullPath) + ";Collating Sequence=MACHINE;");

  OleDbCommand oleCmd = new OleDbCommand(sqlString, oleConn);
  OleDbDataReader oleReader;
  DataColumn col;
  DataRow row;

  DataTable dbfTable = new DataTable();

  try
  {
      oleConn.Open();
      //Bug in VFP OLE Data Adapter blows up with error 
      //  "The provider could not determine the decimal value..."
      //  must read with a data reader row by row, column by column

      oleReader = oleCmd.ExecuteReader();
      for (int i = 0; i < oleReader.FieldCount; i++)
      {
          col = new DataColumn(oleReader.GetName(i), oleReader.GetFieldType(i));
          dbfTable.Columns.Add(col);
      }

      while (oleReader.Read())
      {
        row = dbfTable.NewRow();
        for (int i = 0; i < oleReader.FieldCount; i++)
        {
          try
          {
              row[i] = oleReader[i];
          }
          catch (InvalidOperationException)
          {
            row[i] = DBNull.Value;  //work-around for VFP OLEDB Provider glitch
          }
        }

        dbfTable.Rows.Add(row);
      }

  }
  catch (Exception eX)
  {
      throw new FileLoadException("Error Importing From VFP File\n" +
          eX.Message + "\nVFPDataAccess.cs:GetVfpDataTable()", dbfFullPath);
  }
  finally
  {
      oleConn.Close();
  }

  return dbfTable;
}