我正在尝试从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 =“不支持请求” 来源= “System.Data” 错误码= -2147467259 NativeErrorCode = 50
任何人都知道我做错了什么?
答案 0 :(得分:0)
您需要通过模拟执行查询的人来提升权限。
这是进行模仿的一个很好的例子:
答案 1 :(得分:0)
您在creating the assembly in SQL Server时使用WITH PERMISSION_SET = EXTERNAL_ACCESS
了吗?默认情况下,CREATE ASSEMBLY使用SAFE权限集,doesn't include FileIOPermissions,required由SqlFileStream构造函数。
答案 2 :(得分: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;