【发布时间】:2009-09-01 11:11:49
【问题描述】:
我正在尝试从 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="不支持该请求" 源="系统.数据" 错误代码=-2147467259 NativeErrorCode=50
有人知道我做错了什么吗?
【问题讨论】:
-
对答案 1 的响应:不能将“context connection=true”用于模拟 (blogs.msdn.com/dataaccess/archive/2006/01/25/517495.aspx)。打开连接时出现 InvalidOperationException 失败(“在此上下文中不允许数据访问。上下文是未标记为 DataAccessKind.Read 或 SystemDataAccessKind.Read 的函数或方法,是从 Table Valued 的 FillRow 方法获取数据的回调函数,或者是 UDT 验证方法”)。如果我更改连接字符串以指定具有集成安全性的数据源,则会收到与以前相同的错误。
标签: c# sql-server filestream sqlclr