2016-09-02 25 views
-1

スクリプトタスクに外部DLLファイルを追加しました。コードは、スクリプトタスクをデバッグしているときに機能していますが、SSISパッケージをデバッグせずに直接実行するとコードが機能しません。だから私は例外は、呼び出しのターゲットによってスローされて取得しています。 ssisこれにはエラーがあります。誰にでもこの問題の解決策がありますか?私はGACにdllを登録し、マシンを再起動しました。しかしまだそれは私にこのエラーを与えています呼び出しのターゲットによって例外がスローされました。 ssisスクリプトタスク

答えて

0

私はこの問題の解決策を見つけるのは困難でした(解決策がないという問題は、少なくとも2〜3回ここに掲載されています)。これは、特定のDBFを読むときに.NETでVFP OLEDBデータプロバイダが爆発することと関係しています。

明らかに、問題は、VFPでは小数点の右側から桁を取り出して左側で使用できるようになっていることに由来します。たとえば、列がN(5,3)として定義されている場合は、9.999までの数値しか保持しませんが、小数点の右側に3桁の小数点以下の桁をすべて必要としない場合は、残りのスペースを使用できます左側の数字の場合この列は999.9を保持します!いずれにしても、InvalidOperationExceptionがスローされます。これにより、DataAdapterのFill()メソッドを使用してデータを読み取ることができなくなります。回避策は、データ・リーダーを使用し、DataTableをゼロから作成し、各行に一度に1つずつ、各列を移入することです。例外が発生した場合は、値として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; 
} 
関連する問題