sql-server - 从 SQL CLR 程序集访问 FILESTREAM

标签 sql-server ado.net filestream sqlclr

我正在尝试从不安全的 SQL CLR 程序集流式传输 FILESTREAM 数据。

连接字符串是

Data Source=LAPTOP2\SQLEXPRESS;Initial Catalog=test;Integrated Security=True;Enlist=False

当创建一个新的 SqlFileStream 时(当然是在 SqlTransaction 中),我得到:

The request is not supported

OpenSqlFilestream

所以我决定尝试原生 OpenSqlFilestream ,但随后我得到一个无效句柄 (-1) 而 GetLastWin32Error 返回相同的句柄:

The request is not supported (ERROR_NOT_SUPPORTED).

我也试过 SqlContext.WindowsIdentity.Impersonate() 没有明显效果。

我找不到任何引用此限制的文档。真的不支持吗?如果不支持,是否有充分的理由?有人知道解决方法吗?

最佳答案

要访问外部资源,如果您对程序集使用 external_access 或 unsafe 权限,则需要将 trustworthy 设置为数据库,否则 SQL Server 根本不会信任您的代码,不会让它离开实例。 对于文件访问(阅读),我使用了

            System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
            using (StreamReader reader = new StreamReader(FilePath, Encoding.Default))
            {

                string line;
                string allLine = "";

                while ((line = reader.ReadLine()) != null)
                {

                    allLine += line;

                }

            }

以及文件写入用

FileStream aFile = new FileStream(path, FileMode.Append, FileAccess.Write);
        StreamWriter sw = new StreamWriter(aFile, Encoding.Default);

        sw.Write(FilecontentsTOWrite);
        sw.Close();
        aFile.Close();

关于sql-server - 从 SQL CLR 程序集访问 FILESTREAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12986909/

相关文章:

asp.net-mvc - 元数据集合中不存在标识为 ' ' 的成员。\r\n参数名称 : identity

c# - 需要帮助在字节级操作 WAV (RIFF) 文件

sql-server - 删除值后如何重置 SQL Server 所有表的标识列?

sql - 获取列上的时间,忽略文本

sql-server - 无法将参数值从 TimeSpan 转换为 DateTime

c# - 我如何让这个数据集添加我的新行并正确更新?

c# - 如何在逐字节读取 CSV 文件时检测字节是否为换行符 - C#

C# - 从文件中读取特定字符串的字节

c# - 在 Linq-To-Entities 中是否有替代 DateTime.Ticks 或 DateTime.TimeOfDay 的方法?

mysql - 我如何在此 SQL 语句中使用 "as"?