2016-04-14 9 views
0

Excelファイルを読み込んでデータセットにデータを挿入したい。私はいくつかのファイルを読むことができ、それは正常に動作しますが、場合によっては正しく動作しません。私はエラーとファイルのスクリーンショットも添付しています。 そのファイルのブロックを解除して一度開いて保存すると、コードが機能します。以下 は私のコードです:Excelファイルを読み込んでデータセットにデータを追加

try 
{ 
    startTime = DateTime.Now; 
    System.IO.FileStream fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite); 
    IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs); 
    excelReader2007.IsFirstRowAsColumnNames = false; 
    DataSet result = excelReader2007.AsDataSet(); 
    if (result.Tables.Count > 0) 
    { 
     ds = result; 
    } 
    fs.Close(); 
    fs.Dispose(); 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel"); 
} 
catch (Exception ex) 
{ 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message)); 
} 

Error link

+0

ヌルポインタエラーはどの行に現れますか?リンクを見ることができない人のために:http://i.stack.imgur.com/kLt7F.png – Draken

+0

これ以上の分析では、この時点で発生するようです: 'InsertExecLogDetails()' その方法行う?あなたは例を投稿できますか? – Draken

+0

IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs);ここではfsはnullのままです –

答えて

0

これを試してみてください:

System.IO.FileStream fs; 
try 
{ 
    startTime = DateTime.Now; 
    fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite); 
    IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs); 
    excelReader2007.IsFirstRowAsColumnNames = false; 
    DataSet result = excelReader2007.AsDataSet(); 
    if (result.Tables.Count > 0) 
    { 
     ds = result; 
    } 

    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel"); 
} 
catch (Exception ex) 
{ 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message)); 
} 
finally 
{ 
    if (fs != null){ 

     try{ 
      fs.Close(); 
      fs.Dispose(); 
     } 
     catch(Exception ex){ 
      //Error handling for being unable to close file 
     } 
    } 
} 

あなたが前の実行の実行によって、開いているファイルを残していると、それを適切に閉じられていないようですねこれはうまくいけばあなたの問題を解決するはずです。ない場合は、何か他のものはまだファイル

を使用するか、それはあなたのためのファイルの使用を閉鎖するようにあなたがusing機能を使用することができ、here

を見ているかどうかをチェックし、[編集] using機能の例( )また、あなたのIExcelDataReaderにusingを使用する必要があるかもしれないが、私はAPIをチェックしていません:

try 
{ 
    using(System.IO.FileStream fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite)) 
    { 
     startTime = DateTime.Now; 
     IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs); 
     excelReader2007.IsFirstRowAsColumnNames = false; 
     DataSet result = excelReader2007.AsDataSet(); 
     if (result.Tables.Count > 0) 
     { 
      ds = result; 
     } 

     InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel"); 
    } 
} 
catch (Exception ex) 
{ 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message)); 
} 

[EDIT2]

問題は、NTFSシステムsettiによって引き起こされていますそれは安全ではないですと言っフラグngを、あなたはそれをブロック解除するには、次のコードを使用してファイルにアクセスする前にそれを呼び出す必要があります。

public class FileUnblocker { 

    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool DeleteFile(string name); 

    public bool Unblock(string fileName) { 
     return DeleteFile(fileName+ ":Zone.Identifier"); 
    } 
} 

Source

をだからあなたの結果のコードは次のようになります。

try 
{ 

    if (new FileUnblocker().Unblock(FullfilePath)) 
    { 
     using(System.IO.FileStream fs = new System.IO.FileStream(FullfilePath, System.IO.FileMode.Open, FileAccess.ReadWrite)) 
     { 
      startTime = DateTime.Now; 
      IExcelDataReader excelReader2007 = ExcelReaderFactory.CreateOpenXmlReader(fs); 
      excelReader2007.IsFirstRowAsColumnNames = false; 
      DataSet result = excelReader2007.AsDataSet(); 
      if (result.Tables.Count > 0) 
      { 
       ds = result; 
      } 

      InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Success), "Table generated from excel"); 
     } 
    } 
    else{ 
     //Issue with unblocking, deal with it here 
    } 
} 
catch (Exception ex) 
{ 
    InsertExecLogDetails(startTime, DateTime.Now, Convert.ToString(Common.EventNames.GenerateDataTableFromExcel), Convert.ToString(Common.StatusEnum.Failure), Convert.ToString(ex.Message)); 
} 
+0

こんにちは、 私は両方のソリューションを試しましたが、動作しません。問題は、Excelファイルのプロパティをクリックしてブロック解除をクリックして開くと、このコードが保存されている場合です。 –

+0

ああ、セキュリティ権限、私は今理解しています。これを見てください: http://stackoverflow.com/questions/6374673/unblock-file-from-within-net-4-c-sharp – Draken

+0

更新されたコードを確認してください – Draken

関連する問題