Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在.NET C中设置/获取SQL会话上下文#_C#_Sql Server_Sessioncontext - Fatal编程技术网

C# 无法在.NET C中设置/获取SQL会话上下文#

C# 无法在.NET C中设置/获取SQL会话上下文#,c#,sql-server,sessioncontext,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

几个月前我就已经开始工作了,但是我无法读回会话变量集 在代码中,但我可以在查询分析器中。。 此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')

知道为什么吗?

您正在使用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);
}

SPSDatabaseInfo
是如何实现的?如果不知道
sp\u set\u session\u context
是如何工作的,或者这两个命令是如何执行的,以及何时执行,@cyridurand执行标量是对Microsoft.ApplicationBlocks.Data.SqlHelper的包装,那么它就帮不上忙了functions@mxmissile-会话上下文为标准sql2016及以上版本功能性感谢@Daniel Brughera-事实上,这就是问题所在!:)