Получить список zip-файлов с SQL Server

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

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

Вместо этого используйте ZipArchive, чтобы передать поток.

Renatas M. 26.11.2018 13:18

Вы не можете без разархивирования файла. SQL Server не имеет метода распаковки, поэтому вам придется создать хранимую процедуру или использовать внешний инструмент. Я бы использовал утилиту SQL SQLCMD.EXE и создал бы свой собственный инструмент для получения имен файлов.

jdweng 26.11.2018 13:28

Почему бы просто не сохранить список файлов в отдельном столбце varchar (max) вдоль zip-потока?

Andrey Nikolov 26.11.2018 14:01

1) в этом случае при загрузке файла мне нужно добавить этот список файлов программно, 2) или мне нужен триггер, который бы каким-то образом определял содержимое (и все то же самое - как это сделать без извлечения в базу данных) ? Я хочу динамически получать содержимое архива.

egeo 26.11.2018 14:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
819
1

Ответы 1

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

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;

Другие вопросы по теме