SQL dosyaları, SQL DB'den alındığında bozuk

Ben Excel dosyalarını (PDF gibi diğer dosya türleriyle birlikte) ikili veri olarak depolayan bir SQL DB ile çalışıyorum. Bu dosyaları dosya sistemine ayıklamak için aşağıdaki kodu kullanıyorum.

Sorun: PDF dosyaları iyi çıktı. Ancak Excel için dosyalar oluşturulur ve onları açmaya çalıştığımda çökerler veya sadece çöp metinleri verirler.

Bu kodu dosyaları almak için bu uygulamayı yazan önceki adamdan kullanıyorum. Bu kod, tam anlamıyla anlamadığım OpenMcdf'yi kullanmaktadır çünkü ben bunun için yararlı çevrimiçi belgeler bulamadım.

//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);
}

Burada neler olduğu hakkında bir fikrin var mı? excel neden bozuk? Arama saatlerine rağmen çok fazla İnternet bulamadım!

herhangi bir fikir, öneri veya çözüm takdir edilecektir.

Teşekkürler

0
NEDEN veritabanı ve hangi sürüm? SQL , yalnızca Yapılandırılmış Sorgu Dili'dir - birçok veritabanı sistemi tarafından kullanılan bir dildir - SQL bir veritabanı ürünüdür NOT ... bu gibi şeyler sıklıkla satıcıya özel - yani gerçekten kullandığınız veritabanı sistemi 'yi bilmemiz gerekiyor.
katma yazar marc_s, kaynak
İlk tahmin SqlDataReader'ın belirtilmesiyle SQL Server olur.
katma yazar sq33G, kaynak
iyi ... 'SQL DB' açıkça Microsoft SQL Server olduğunu belirtti! ve 2005
katma yazar user732528, kaynak

1 cevap

SaveToDisk mantığınızı aşağıdaki gibi değiştirin:

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;
    }
}
0
katma