Доступ к Sql FILESTREAM из хранимой процедуры CLR - PullRequest
2 голосов
/ 01 сентября 2009

Я пытаюсь получить доступ к потоку файлов Sql из хранимой процедуры CLR. Я создал очень простую базу данных с одной таблицей, которая включает столбец filestream. Я могу успешно читать из файлового потока с помощью простого консольного приложения. Вот пример кода для сбоев proc:

[SqlProcedure]
public static void GetDataFromFileStream(string path, out int data)
{
    using (var connection = new SqlConnection("context connection=true"))
    {
        connection.Open();

        var transaction = connection.BeginTransaction();

        var transactionContext = GetTransactionContext(connection, transaction);

        // the following line throws an exception
        var sqlFileStream = new SqlFileStream(path, transactionContext, FileAccess.Read);

        var buffer = new byte[4];
        sqlFileStream.Read(buffer, 0, 4);

        data = BitConverter.ToInt32(buffer, 0);
    }
}

private static byte[] GetTransactionContext(SqlConnection connection, SqlTransaction transaction)
{
    using (var cmd = connection.CreateCommand())
    {
        const string myGetTxContextQuery = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()";
        cmd.CommandText = myGetTxContextQuery;
        cmd.CommandTimeout = 60;
        cmd.CommandType = CommandType.Text;
        cmd.Transaction = transaction;
        return (byte[])cmd.ExecuteScalar();
    }
}

При попытке создать экземпляр SqlFileStream выдается исключение:

Произошла исключительная ситуация System.ComponentModel.Win32Exception Сообщение = "Запрос не поддерживается" Источник = "System.Data" ErrorCode = -2147467259 NativeErrorCode = 50

Кто-нибудь знает, что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2009

Использовали ли вы WITH PERMISSION_SET = EXTERNAL_ACCESS при создании сборки в SQL Server ? По умолчанию CREATE ASSEMBLY использует набор разрешений SAFE, который не включает FileIOPermissions, требуется для конструктора SqlFileStream.

0 голосов
/ 25 февраля 2010

Мне не удалось использовать SqlFileStream для доступа к файловым потокам напрямую из среды CLR (из-за проблем, указанных выше). Решение, которое я в конечном итоге принял, состояло в том, чтобы использовать хранимую процедуру SQL, чтобы получить подмножество необходимых мне файловых потоков. Хотя это не особенно эффективно в некоторых сценариях, этого достаточно для моего приложения

    CREATE PROC ReadFromFilestream
    (
        @pfilestreamGUID    UNIQUEIDENTIFIER,
        @pOffsetIntoData    INT,
        @pLengthOfData      INT,
        @pData              VARBINARY(MAX) OUTPUT
    )
    AS
    BEGIN;
        SELECT @pData  = SUBSTRING(ValueData, @pOffsetIntoData, @pLengthOfData)
          FROM [MESL].DataStream
         WHERE DataStreamGUID = @pfilestreamGUID;
    END;
0 голосов
/ 01 сентября 2009

Вам необходимо повысить уровень разрешений, выдав себя за лицо, выполняющее запрос.

Вот хороший пример подражания:

http://drowningintechnicaldebt.com/blogs/shawnweisfeld/archive/2009/06/11/sql-clr-query-the-file-system-to-get-a-list-of-folders.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...