c# - 从 CLR 存储过程中访问 Sql FILESTREAM

标签 c# sql-server filestream sqlclr

我正在尝试从 CLR 存储过程访问 Sql 文件流。我已经建立了一个非常简单的数据库,其中包含一个包含文件流列的表。我可以使用一个简单的控制台应用程序成功地从文件流中读取。下面是失败过程的一些示例代码:

[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="不支持该请求" 来源=“系统.数据” 错误代码=-2147467259 NativeErrorCode=50

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

最佳答案

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

这是一个很好的模拟示例:

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

关于c# - 从 CLR 存储过程中访问 Sql FILESTREAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1361861/

相关文章:

c# - 如何获取 XML 属性的值?

sql - INSTEAD OF 触发器和 CASCADE 路径

sql-server - 在 SQL Server 中获取查询的列名

sql - TSQL - 无效的列名行号

c# - 防止对 FILESTREAM 进行写操作?

c++ - 使用相同流对象的 io 操作

c# - 为什么需要typeof?

c# - 无法在 visual studio-15 中更改安装项目的平台

file-io - 将 MemoryStream 转换为 FileStream 会创建数百个相同的文件?

c# - 使用 7z.exe 在 C# 中解压缩文件