几个月前我已经开始使用此功能,但是我无法读回会话变量集 在代码中,但我可以在查询分析器中.. 这个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')
有什么想法吗?
答案 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);
}