0

几个月前我有这个工作,但我无法读回代码中设置的会话变量,但我可以在查询分析器中..这个 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);

它返回 null 但我可以在管理工作室中设置和读取它没问题

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

任何想法为什么?

4

1 回答 1

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);
}
于 2019-03-11T14:11:20.807 回答