GET_FILESTREAM_TRANSACTION_CONTEXT (Transact-SQL)

返回表示会话的当前事务上下文的标记。应用程序使用此标记可将 FILESTREAM 文件系统流式处理操作绑定到该事务。有关 FILESTREAM 主题的列表,请参阅设计和实现 FILESTREAM 存储

主题链接图标Transact-SQL 语法约定

语法

GET_FILESTREAM_TRANSACTION_CONTEXT ()

返回类型

varbinary(max)

返回值

如果尚未启动事务或者已经取消或提交事务,则返回 NULL。

注释

事务必须为显式的。使用 BEGIN TRANSACTION,后跟 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION。

调用 GET_FILESTREAM_TRANSACTION_CONTEXT 时,系统将在事务持续期间授予调用方对事务的文件系统访问权。若要允许其他用户通过文件系统访问事务,则使用 EXECUTE AS 以其他用户身份运行 GET_FILESTREAM_TRANSACTION_CONTEXT。

示例

下面的示例在 Transact-SQL 事务中使用 GET_FILESTREAM_TRANSACTION_CONTEXT 获取事务上下文。

using System;
using System.Data.SqlClient;
using System.Data;

namespace ConsoleApplication
{
    /// <summary>
    /// This class is a wrapper that contains methods for:
    /// 
    ///     GetTransactionContect() - Returns the current transaction context.
    ///     BeginTransaction() - Begins a transaction.
    ///     CommmitTransaction() - Commits the current transaction.
    /// 
    /// </summary>

    class SqlAccessWrapper
    {
        /// <summary>
        /// Returns a byte array that contains the current transaction
        /// context.
        /// </summary>
        /// <param name="sqlConnection">
        /// SqlConnection object that represents the instance of SQL Server
        /// from which to obtain the transaction context. 
        /// </param>
        /// <returns>
        /// If there is a current transaction context, the return
        /// value is an Object that represents the context.
        /// If there is not a current transaction context, the
        /// value returned is DBNull.Value.
        /// </returns>

        public Object GetTransactionContext(SqlConnection sqlConnection)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()";
            cmd.CommandType = CommandType.Text;
            cmd.Connection = sqlConnection;

            return cmd.ExecuteScalar();

        }

        /// <summary>
        /// Begins the transaction.
        /// </summary>
        /// <param name="sqlConnection">
        /// SqlConnection object that represents the server
        /// on which to run the BEGIN TRANSACTION statement.
        /// </param>

        public void BeginTransaction(SqlConnection sqlConnection)
        {
            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "BEGIN TRANSACTION";
            cmd.CommandType = CommandType.Text;
            cmd.Connection = sqlConnection;

            cmd.ExecuteNonQuery();
        }

        /// <summary>
        /// Commits the transaction.
        /// </summary>
        /// <param name="sqlConnection">
        /// SqlConnection object that represents the instance of SQL Server
        /// on which to run the COMMIT statement.
        /// </param>

        public void CommitTransaction(SqlConnection sqlConnection)
        {
            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "COMMIT TRANSACTION";
            cmd.CommandType = CommandType.Text;
            cmd.Connection = sqlConnection;

            cmd.ExecuteNonQuery();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //Open a connection to the local instance of SQL Server.

            SqlConnection sqlConnection = new SqlConnection("Integrated Security=true;server=(local)");
            sqlConnection.Open();

            SqlAccessWrapper sql = new SqlAccessWrapper();

            //Create a transaction so that sql.GetTransactionContext() will succeed.
            sql.BeginTransaction(sqlConnection);

            //The transaction context will be stored in this array.
            Byte[] transactionToken;   

            Object txObj = sql.GetTransactionContext(sqlConnection);
            if (DBNull.Value != txObj)
            {
                transactionToken = (byte[])txObj;
                Console.WriteLine("Transaction context obtained.\n");
            }

            sql.CommitTransaction(sqlConnection);
        }
    }
}
Imports System
Imports System.Data.SqlClient
Imports System.Data

Namespace ConsoleApplication
    ''' <summary> 
    ''' This class is a wrapper that contains methods for: 
    ''' 
    ''' GetTransactionContect() - Returns the current transaction context. 
    ''' BeginTransaction() - Begins a transaction. 
    ''' CommmitTransaction() - Commits the current transaction. 
    ''' 
    ''' </summary> 

    Class SqlAccessWrapper
        ''' <summary> 
        ''' Returns a byte array that contains the current transaction 
        ''' context. 
        ''' </summary> 
        ''' <param name="sqlConnection"> 
        ''' SqlConnection object that represents the instance of SQL Server 
        ''' from which to obtain the transaction context. 
        ''' </param> 
        ''' <returns> 
        ''' If there is a current transaction context, the return 
        ''' value is an Object that represents the context. 
        ''' If there is not a current transaction context, the 
        ''' value returned is DBNull.Value. 
        ''' </returns> 

        Public Function GetTransactionContext(ByVal sqlConnection As SqlConnection) As Object
            Dim cmd As New SqlCommand()
            cmd.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()"
            cmd.CommandType = CommandType.Text
            cmd.Connection = sqlConnection

            Return cmd.ExecuteScalar()

        End Function

        ''' <summary> 
        ''' Begins the transaction. 
        ''' </summary> 
        ''' <param name="sqlConnection"> 
        ''' SqlConnection object that represents the server 
        ''' on which to run the BEGIN TRANSACTION statement. 
        ''' </param> 

        Public Sub BeginTransaction(ByVal sqlConnection As SqlConnection)
            Dim cmd As New SqlCommand()

            cmd.CommandText = "BEGIN TRANSACTION"
            cmd.CommandType = CommandType.Text
            cmd.Connection = sqlConnection

            cmd.ExecuteNonQuery()
        End Sub

        ''' <summary> 
        ''' Commits the transaction. 
        ''' </summary> 
        ''' <param name="sqlConnection"> 
        ''' SqlConnection object that represents the instance of SQL Server 
        ''' on which to run the COMMIT statement. 
        ''' </param> 

        Public Sub CommitTransaction(ByVal sqlConnection As SqlConnection)
            Dim cmd As New SqlCommand()

            cmd.CommandText = "COMMIT TRANSACTION"
            cmd.CommandType = CommandType.Text
            cmd.Connection = sqlConnection

            cmd.ExecuteNonQuery()
        End Sub
    End Class

    Class Program
        Shared Sub Main()
            '''Open a connection to the local instance of SQL Server.

            Dim sqlConnection As New SqlConnection("Integrated Security=true;server=(local)")
            sqlConnection.Open()

            Dim sql As New SqlAccessWrapper()

            '''Create a transaction so that sql.GetTransactionContext() will succeed. 
            sql.BeginTransaction(sqlConnection)

            '''The transaction context will be stored in this array. 
            Dim transactionToken As Byte()

            Dim txObj As Object = sql.GetTransactionContext(sqlConnection)

            '''If the returned object is not NULL, there is a valid transaction
            '''token, and it must be converted into a format that is usable within
            '''the application.

            If Not txObj.Equals(DBNull.Value) Then
                transactionToken = DirectCast(txObj, Byte())
                Console.WriteLine("Transaction context obtained." & Chr(10) & "")
            End If

            sql.CommitTransaction(sqlConnection)
        End Sub
    End Class
End Namespace