C# 从SQL Server获取zip文件列表

C# 从SQL Server获取zip文件列表,c#,sql-server,zip,C#,Sql Server,Zip,我在SQL Server数据库中有一个表,其中有一个varbinary(max)列和zip存档。如何在不提取档案的情况下获取这些档案的列表?我的C#应用程序读取这些归档文件的列表,我需要添加有关内容的更多信息 对于文件,我使用System.IO.Compression.FileSystem程序集中的ZipFile类,但是如何传递varbinary数据而不是文件名(例如,如果我创建CLR函数)?这就是您要寻找的吗 SQLCLR C#函数 using System.Data.SqlTypes; us

我在SQL Server数据库中有一个表,其中有一个
varbinary(max)
列和zip存档。如何在不提取档案的情况下获取这些档案的列表?我的C#应用程序读取这些归档文件的列表,我需要添加有关内容的更多信息


对于文件,我使用
System.IO.Compression.FileSystem
程序集中的
ZipFile
类,但是如何传递varbinary数据而不是文件名(例如,如果我创建CLR函数)?

这就是您要寻找的吗

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;

改为使用来传递流。如果不解压缩文件,则无法传递流。SQL Server没有解压方法,因此您必须构建存储过程或使用外部工具。我会使用SQL实用程序SQLCMD.EXE并创建自己的工具来获取文件名。为什么不沿着zip流将文件列表存储在单独的varchar(max)列中?1)在这种情况下,当文件上载时,我需要以编程方式添加此文件列表,2)或者我需要一个触发器来确定内容(以及如何在不提取到数据库的情况下执行此操作)?我希望动态获取归档文件的内容。
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;