2011-10-27 11 views
0

Excelファイル(PDFなどの他のファイルタイプも含む)をバイナリデータとして保存するSQL DBを使用しています。これらのファイルをファイルシステムに抽出するには、次のコードを使用します。SQLデータベースから検索するとExcelファイルが破損する

問題: PDFファイルが正常に出力されます。しかし、Excelの場合、ファイルが作成され、開こうとするとクラッシュしたり、ガベージテキストが表示されたりします。

私はこのファイルを取得するためのこのアプリを書いた前の男からこのコードを使用しています。このコードはOpenMcdfを使用していますが、私は完全に理解できません。

//execution starts here 
public override void SaveToDisk() 
{ 

    byte[] keys = { (byte)0xd0, (byte)0xcf }; 


    //Searches through m_RawOleObject for combination of 'keys' 
    int offset = Utils.SearchBytes(m_RawOleObject, keys); //returns '60' in case of Excel and '66' in case of Pdf 

    //m_RawOleOjbect contains the data from the sqlDataReader (the binary data from the column.) 
    m_RawOleObject = strip(m_RawOleObject, offset); 

    MemoryStream ms = new MemoryStream(m_RawOleObject); 
    CompoundFile cf = new CompoundFile(ms); 
    GetStorageByName(cf.RootStorage, m_StorageName); 

    if (Storage != null) 
    { 
     if (Storage is CFStream) 
     { 
      m_RawOleObject = (Storage as CFStream).GetData(); 
     } 
     m_filename = System.IO.Path.Combine(STOREPATH, Utils.CombineFilenameWithExtension(Filename, m_extension)); 

     WriteToFile(m_filename, m_RawOleObject); 
    } 

} 

protected void WriteToFile(string fn, byte[] obj) 
{ 
    fn = GetNextAvailableFilename(fn, 0); 
    FileStream fs = new FileStream(fn, FileMode.Create); 
    BinaryWriter writer = new BinaryWriter(fs); 
    writer.Write(obj); 
    writer.Close(); 
    fs.Close(); 
    fs.Dispose(); 
} 


protected void GetStorageByName(CFStorage cfs, string name) 
{ 
    VisitedEntryAction va = delegate(CFItem target) 
    { 
     if (target is CFStorage) 
     { 
      GetStorageByName((CFStorage)target, name); 
     } 
     else 
     { 
      if (target.Name == name) 
       Storage = target; 
     } 
    }; 

    //Visit NON-recursively (first level only) 
    cfs.VisitEntries(va, false); 
} 

ここで何が起こっているのですか?なぜExcelは壊れていますか?何時間もの検索にもかかわらず、私は多くのオンラインを見つけることができませんでした!

どのようなアイデア、提案、または解決策にも感謝します。次のように

おかげ

+0

を** WHAT **データベースおよびバージョン?? ** SQL **は単なる構造化照会言語です** **多くの**データベースシステムで使用されている言語** ** SQL **はデータベース製品ではありません**このようなものは非常に多くのベンダーです**特定の** - だから私たちは本当にあなたが使用している**データベースシステム**を知る必要があります.... –

+0

SqlDataReaderの言及を与えられた最初の推測SQL Serverは – sq33G

+0

よく..私は 'SQL DB'明らかにMicrosoft SQL Serverを示しました!それは2005年です – user732528

答えて

0
あなたSaveToDiskロジックを変更し

public override void SaveToDisk() 
{ 
    byte[] keys = { (byte)0xd0, (byte)0xcf, (byte)0x11, (byte)0xe0, (byte)0xa1, (byte)0xb1, (byte)0x1a, (byte)0xe1 }; 
    int offset = Utils.SearchBytes(m_RawOleObject, keys); 
    using (MemoryStream ms = new MemoryStream(strip(m_RawOleObject, offset))) 
    { 
     CompoundFile cf = new CompoundFile(ms, UpdateMode.ReadOnly, true, true); 
     m_filename = GetNextAvailableFilename(System.IO.Path.Combine(STOREPATH, Utils.CombineFilenameWithExtension(Filename, m_extension)), 0); 
     using (var fs = new FileStream(m_filename, FileMode.Create)) 
     { 
      cf.Save(fs); 
      cf.Close(); 
     } 
    } 

    //Workbook would be saved as hidden in previous step 
    Microsoft.Office.Interop.Excel.Application xlApp = null; 
    Microsoft.Office.Interop.Excel.Workbook xlWb = null; 
    try 
    { 
     xlApp = new Microsoft.Office.Interop.Excel.Application(); 
     xlWb = xlApp.Workbooks.Open(m_filename); 
     xlWb.CheckCompatibility = false; 

     foreach (Window wn in xlApp.Windows) 
     { 
      wn.Visible = true; 
     } 
     xlWb.Save(); 
     xlWb.Close(); 
    } 
    catch (Exception e) 
    { 
     //TODO: Log error and continue 
    } 
    finally 
    { 
     if (xlWb != null) 
      Marshal.ReleaseComObject(xlWb); 
     if (xlApp != null) 
      Marshal.ReleaseComObject(xlApp); 
     xlApp = null; 
    } 
} 
関連する問題