CLRストアドプロシージャからSqlファイルストリームにアクセスしようとしています。私はfilestreamカラムを含む単一のテーブルを持つ非常に単純なデータベースを設定しました。私は、簡単なコンソールアプリケーションを使用してファイルストリームから正常に読み取ることができます。ここで失敗したprocのためのいくつかのサンプルコードです。CLRストアドプロシージャ内からSql FILESTREAMにアクセスする
[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は メッセージ= を「要求がサポートされていません」が発生しましたSource = "System.Data" ErrorCode = -2147467259 NativeErrorCode = 50
誰かが間違っていることを知っていますか?
回答への応答1:偽装では "context connection = true"を使用できません(http://blogs.msdn.com/dataaccess /archive/2006/01/25/517495.aspx)。接続を開くときにInvalidOperationExceptionで失敗しました( "このコンテキストではデータアクセスが許可されていません。コンテキストがDataAccessKind.ReadまたはSystemDataAccessKind.Readでマークされていない関数またはメソッドの場合、FallRowメソッドからデータを取得するコールバックです。 Function、またはUDT検証メソッドです)。統合セキュリティでデータソースを指定するために接続文字列を変更すると、前と同じエラーが発生します。 – pete757