Получить список ZIP-файлов из SQL Server - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть таблица в базе данных SQL Server со столбцом varbinary(max) с zip-архивами.Как получить список этих архивов, не распаковывая их?Мое приложение C # читает список этих архивов, и мне нужно добавить больше информации о контенте.

Для файла я использую класс ZipFile из сборки System.IO.Compression.FileSystem, но как передать varbinary данные вместо имени файла (например, если я создаю функцию CLR)?

1 Ответ

0 голосов
/ 27 ноября 2018

Это то, что вы ищете?

Функция 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;

(Если вы не администратор БД, вам захочется быстро подружиться.)

Это, конечно, простой UDF - вы, вероятно, хотите сделать что-то немного другое(например, сделайте UDF CLR на основе таблицы, чтобы возвращать записи по одной).

Если вам нужно открыть файлы из архива в столбце данных, это становится сложнее.Помимо прочего, вам придется добавить 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;
...