我在SQL Server数据库中有一个表,其中包含一个带有zip存档的varbinary(max)列。如何在不解压的情况下获得这些存档的列表?我的C#应用程序读取这些存档的列表,我需要添加有关内容的更多信息。
对于文件,我使用来自System.IO.Compression.FileSystem程序集的ZipFile类,但是如何传递可变二进制数据而不是文件名(例如,如果我创建CLR函数)?
发布于 2018-11-27 06:32:20
这就是你要找的东西吗?
SQLCLR C#函数...
using System.Data.SqlTypes;
using System.IO;
using System.IO.Compression;
using System.Linq;
public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString ZipEntries(SqlBytes data) {
        using (var stream = new MemoryStream(data.Value))
        using (var archive = new ZipArchive(stream))
            return new SqlString(string.Join(",", archive.Entries.Select(e => e.Name)));
    }
}下面是我用来测试的SQL。令人惊讶的是,它起作用了。
-- Create table with ZIP archive column...
CREATE TABLE dbo.ZipImages(ZipArchive VARBINARY(MAX));
GO
-- ... then insert ZIP archive content into the dbo.ZipImages table ...
-- (code not included)
GO
-- ... then prove it works.
SELECT dbo.ZipEntries(ZipArchive) FROM dbo.ZipImages;
GO您的数据库可能/可能会抱怨System.IO.Compression不可用,在这种情况下,您可以尝试...
ALTER DATABASE [<your database>] SET TRUSTWORTHY ON;
CREATE ASSEMBLY [System.IO.Compression]
FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;(如果您不是DBA,您将希望快速结交朋友。)
显然,这只是一个基本的UDF --您可能希望做一些稍微不同的事情(比如使它成为一个基于表的CLR UDF,逐个返回条目)。
如果需要从数据列中的归档文件中打开文件,则会变得更加棘手。除此之外,您还必须将System.IO.Compression.File作为程序集添加,这(不幸的是)是不安全的,并且会使很多事情复杂化……
CREATE ASSEMBLY [System.IO.Compression.FileSystem]
FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.FileSystem.dll'
WITH PERMISSION_SET = UNSAFE;https://stackoverflow.com/questions/53480908
复制相似问题