将SQL Server图像字段反序列化回Excel格式

nhn9ugyo  于 2022-12-20  发布在  SQL Server
关注(0)|答案(1)|浏览(112)

我有一个SQL Server表,其中包含序列化的Excel文件,有3个字段:
身份单据-〉整数(主键)
数据文件-〉图像
文件名-〉nvarchar
其中DataFile包含序列化的Excel文件,FileName是文件的名称(带路径)。
大概是这样的
0xD0CF11E0A1B11AE100(已启用).....
U:\SAP_R3V4_Validation_Documents\March2012.xls
现在我需要把这些文件恢复为Excel格式。
我怎样才能做到这一点?
使用C#控制台应用程序或SQL Server功能可以很好。
先谢谢你。
路易斯

4nkexdtk

4nkexdtk1#

Excel文件是二进制的。xls已经过时,从2007年(15年前)起被xlsx(一个包含XML文件的ZIP包)所取代。这个问题显示的是二进制数据在SSMS中的外观,而不是某种序列化格式。
顺便说一句,image已经过时了,在2005年或2008年被varbinary(max)取代(不记得了)。
在任何情况下,阅读二进制数据都与读取任何其他数据相同。DbDataReader用于检索查询结果,强类型方法用于读取每行的特定字段。在此特定情况下,GetStream()可用于检索数据,作为可保存到磁盘的流:

using var con=new SqlConnection(connectionString)
{
    using (var cmd=new SqlCommand(sql,con))
    {
        using (var reader=cmd.ExecuteReader())
        {
            while(reader.Read())
            {
                var path=reader.GetString(2);
                var finalPath=Path.Combine(root,Path.GetFileName(path))

                using(var stream=reader.GetStream(1))
                {
                    using(var fileStream=File.Create(finalPath))
                    {
                        stream.CopyTo(fileStream);
                    }
                }
            }
        } 
    }
}

唯一不同的是将字段作为流读取并将其保存到磁盘的代码

using(var stream=reader.GetStream(1))
{
    using(var fileStream=File.Create(finalPath))
    {
        stream.CopyTo(fileStream);
    }
}

using子句用于确保即使在出错的情况下也关闭数据和文件流。路径本身是通过将根文件夹与存储的文件名(而不是完整路径)组合在一起来构造的

相关问题