Невозможно установить / получить SQL session_context в .NET C # - PullRequest
0 голосов
/ 11 марта 2019

У меня это работало несколько месяцев назад, но я не могу прочитать набор переменных сеанса в коде, но я могу в анализаторе запросов .. этот код 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);

возвращается ноль, но я могу установить и прочитать его без проблем в студии управления

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

Есть идеи, почему?

1 Ответ

1 голос
/ 11 марта 2019

Вы используете метод 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...