3

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="リクエストはサポートされていません"Source= "System.Data" ErrorCode = -2147467259 NativeErrorCode = 50

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

4

3 に答える 3

0

クエリを実行している人になりすまして、権限を昇格させる必要があります。

なりすましを行う良い例を次に示します。

http://drowningintechnicaldebt.com/blogs/shawnweisfeld/archive/2009/06/11/sql-clr-query-the-file-system-to-get-a-list-of-folders.aspx

于 2009-09-01T17:18:34.733 に答える
0

SQL Serverでアセンブリを作成WITH PERMISSION_SET = EXTERNAL_ACCESSするときに使用しましたか?デフォルトでは、CREATE ASSEMBLYは、SqlFileStreamコンストラクターに必要なFileIOPermissionsを含まないSAFEパーミッションセットを使用します。

于 2009-11-30T00:40:03.137 に答える
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;
于 2010-02-25T11:25:07.277 に答える