3

我正在尝试从 CLR 存储过程访问 Sql 文件流。我已经建立了一个非常简单的数据库,其中包含一个包含文件流列的单个表。我可以使用一个简单的控制台应用程序成功地从文件流中读取。这是失败的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 发生 Message="不支持请求" Source="System.Data" ErrorCode=-2147467259 NativeErrorCode=50

有人知道我在做什么错吗?

4

3 回答 3

0

您需要通过模拟执行查询的人来提升权限。

这是进行模拟的一个很好的例子:

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

于 2009-09-01T17:18:34.733 回答
0

在 SQL Server 中创建程序集WITH PERMISSION_SET = EXTERNAL_ACCESS时是否使用过?默认情况下,CREATE ASSEMBLY 使用 SAFE 权限集,它不包括SqlFileStream 构造函数所需的FileIOPermissions 。

于 2009-11-30T00:40:03.137 回答
0

我无法使用 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;
于 2010-02-25T11:25:07.277 回答