2009-09-01 32 views
2

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

誰かが間違っていることを知っていますか?

+0

回答への応答1:偽装では "context connection = true"を使用できません(http://blogs.msdn.com/dataaccess /archive/2006/01/25/517495.aspx)。接続を開くときにInvalidOperationExceptionで失敗しました( "このコンテキストではデータアクセスが許可されていません。コンテキストがDataAccessKind.ReadまたはSystemDataAccessKind.Readでマークされていない関数またはメソッドの場合、FallRowメソッドからデータを取得するコールバックです。 Function、またはUDT検証メソッドです)。統合セキュリティでデータソースを指定するために接続文字列を変更すると、前と同じエラーが発生します。 – pete757

答えて

0

(前述の問題のため)CLR内から直接ファイルストリームにアクセスするためにSqlFileStreamを使用することができませんでした。私が最終的に採用した解決策は、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; 
0

あなたはcreating the assembly in SQL ServerWITH PERMISSION_SET = EXTERNAL_ACCESSを使用しました:

ここで偽装を行うことの良い例がありますか?既定では、CREATE ASSEMBLYはSAFEアクセス許可セットを使用します。doesn't include FileIOPermissions、requiredはSqlFileStreamコンストラクターによって作成されます。

+0

はい、アセンブリはEXTERNAL_ACCESS権限を使用しています。残念ながら、私はさらに調査する時間がありませんでしたが、すぐにそうする予定です。私は何らかの進歩について報告します。 – pete757

関連する問題