无法在.NET C#中设置/获取SQL session_context

时间:2019-03-11 13:45:48

标签: c# sql-server sessioncontext

几个月前我已经开始使用此功能,但是我无法读回会话变量集 在代码中,但我可以在查询分析器中.. 这个C#代码设置了变量

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

但是当我用

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

它返回空值,但我可以在Management Studio中设置和读取它

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您正在使用SPSDatabaseInfo.ExecuteScalar方法发送连接字符串而不是打开的SQLConnection,该方法在内部正在创建/打开/关闭其自己的连接。

这意味着您的呼叫在不同的会话下运行。

对两个查询使用相同连接的ExecuteScalar方法的重载

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);
}

这样

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);
}