从SQL Server获取zip文件列表

时间:2018-11-26 12:13:47

标签: c# sql-server zip

我在SQL Server数据库中有一个带有(ST_Distance(rpoint, 'POINT( ? )', True)/1000) $result = DB::select($expression, [$lon.' '.$lat, ...]); 列的表,其中包含zip存档。我如何获取这些档案的列表而不提取它们?我的C#应用​​程序读取这些档案的列表,我需要添加有关内容的更多信息。

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

1 个答案:

答案 0 :(得分:0)

这是您要寻找的吗?

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作为程序集,(不幸的是)这是UNSAFE并使一堆事情变得复杂...

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;