简体   繁体   中英

Cannot set/get SQL session_context in .NET C#

I had this working a few months ago but i cant read back a session variable set in code but i can in the query analyzer.. this C# code sets the variable

String.Format("EXEC sp_set_session_context N'TENANTID', '{0}'", tenantId); 
SPSDatabaseInfo.ExecuteScalar(SPSDatabaseInfo.DBType.MSSQLServer, _connString, sql, null);

but when i read it back immediately with

sql = "select SESSION_CONTEXT(N'TENANTID') AS SESSION_ID"; 
var retVal = SPSDatabaseInfo.ExecuteScalar(SPSDatabaseInfo.DBType.MSSQLServer, _connString, sql, null);

it comes back null but i can set and read it no problem in the management studio

EXEC sys.sp_set_session_context @key = N'TENANTID', @value = 'TEST_ID'
select SESSION_CONTEXT(N'TENANTID')

Any ideas why ?

You are using SPSDatabaseInfo.ExecuteScalar method sending a connection string instead of an open SQLConnection, that method internally is creating/opening/closing it's own connection.

That means that your calls are running under different sessions.

Use this overload of ExecuteScalar method using the same connection for both queries

public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText)
{
    //pass through the call providing null for the set of SqlParameters
    return ExecuteScalar(connection, commandType, commandText, (SqlParameter[])null);
}

this way

using (SqlConnection cn = new SqlConnection(_connString))
{
    cn.Open();
    String.Format("EXEC sp_set_session_context N'TENANTID', '{0}'", tenantId); 
    SPSDatabaseInfo.ExecuteScalar(cn, CommandType.Text, sql);

    sql = "select SESSION_CONTEXT(N'TENANTID') AS SESSION_ID"; 
    var retVal = SPSDatabaseInfo.ExecuteScalar(cn, CommandType.Text, sql);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM