Dela via


GET_FILESTREAM_TRANSACTION_CONTEXT (Transact-SQL)

Gäller för:SQL Server

Returnerar en token som representerar den aktuella transaktionskontexten för en session. Token används av ett program för att binda FILESTREAM-strömningsåtgärder till transaktionen. En lista över FILESTREAM-artiklar finns i Binary Large Object (Blob) Data (SQL Server).

Transact-SQL syntaxkonventioner

Syntax

GET_FILESTREAM_TRANSACTION_CONTEXT()

Returtyper

varbinary(max)

Returvärde

NULL returneras om transaktionen inte har startats eller har avbrutits eller checkats in.

Anmärkningar

Transaktionen måste vara explicit. Använd BEGIN TRANSACTION följt av COMMIT TRANSACTION eller ROLLBACK TRANSACTION.

När du anropar GET_FILESTREAM_TRANSACTION_CONTEXTbeviljas anroparen filsystemåtkomst till transaktionen under transaktionens varaktighet. Om du vill tillåta en annan användare åtkomst till transaktionen via filsystemet använder du EXECUTE AS för att köra GET_FILESTREAM_TRANSACTION_CONTEXT som den andra användaren.

Examples

I följande exempel används GET_FILESTREAM_TRANSACTION_CONTEXT i en Transact-SQL transaktion för att hämta transaktionskontexten.

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

namespace ConsoleApplication
{
    /// <summary>
    /// This class is a wrapper that contains methods for:
    ///
    ///     GetTransactionContext() - Returns the current transaction context.
    ///     BeginTransaction() - Begins a transaction.
    ///     CommitTransaction() - 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);
        }
    }
}