Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
При попытке посредством ADO.NET при открытии соединения выполнить SET CONTEXT_INFO прилетело
exception
InnerException Message: Resetting the connection results in a different state than the initial login. The login fails.
Login failed for user 'blah-blah-blah'.

google'ние привело на
http://www.sqlserverf1.com/tag/resetting-the-connection-results-in-a-different-state-than-the-initial-login-the-login-fails/
Error: 4021, Severity: 16, Resetting the connection results in a different state than the initial login. The login fails.

дальнейшее google'ние ничего вменяемого не дало...

Можете пояснить этиологию событий? Из-за чего она возникла? Как можно воссоздать ее?
_________________
"Helo, word!" - 17 errors 56 warnings
6 фев 15, 11:45    [17227244]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Ex_Soft,

Мне кажется, это может быть что то, связанное с необработкой результата предыдущего запроса.
6 фев 15, 12:03    [17227412]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
alexeyvg
Ex_Soft,

Мне кажется, это может быть что то, связанное с необработкой результата предыдущего запроса.
Или этого запроса - может, вы использовали вызов ADO.NET с получением рекордсета.
6 фев 15, 12:04    [17227415]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
alexeyvg
Мне кажется, это может быть что то, связанное с необработкой результата предыдущего запроса.

Ex_Soft
при открытии соединения

Грубо говоря это выглядит так:
var connection = new SqlConnection(connectionString);
connection.StateChange += delegate(Object sender, StateChangeEventArgs e)
{
      if (e.CurrentState == ConnectionState.Open)
      {
            SetContext(connection);
      }
};
connection.Open();

или Вы подразумеваете, что в честном физическом connection'е, полученном из пула, остался какой-то мусор?

alexeyvg
Или этого запроса - может, вы использовали вызов ADO.NET с получением рекордсета.

Дык... Еще ж ничего не начинает запрашиваться...
6 фев 15, 12:21    [17227541]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Ex_Soft
Дык... Еще ж ничего не начинает запрашиваться...
А "SetContext" - это что, это же ваша функция? Она использует коннект, выполняет в нём запрос к серверу, в контексте базы данных?

И вообще, я не понимаю, connection.Open() - открывает коннект.
ДО этого проверяется статус коннекта - если он открыт, делаем запрос...
А потом уже выполняем открытие коннекта :-)

Я вообще не специалист по C#, не программировал на нём уже давно, новые веяния языка прошли мимо меня, так что извините, если что :-)

Эксепшен то на какой строке возникает, на connection.Open()?
6 фев 15, 12:46    [17227680]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Ex_Soft
Грубо говоря это выглядит так:

Ex_Soft
При попытке посредством ADO.NET при открытии соединения выполнить SET CONTEXT_INFO прилетело

Непонятно в вашем сообщении, при каком действии прилетает эксепшен. Из исходного текста следует, что при выполнении SQL-запроса к базе данных "SET CONTEXT_INFO"
Для выполнения SQL-запросов соединение, естественно, УЖЕ должно быть установлено.
6 фев 15, 12:51    [17227734]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
alexeyvg
А "SetContext" - это что, это же ваша функция? Она использует коннект, выполняет в нём запрос к серверу, в контексте базы данных?

Угу... Только не запрос, а
        public static void SetContext(IDbConnection connection)
        {
            const string COMMAND_TEXT = @"DECLARE @Var nvarchar(max), @BinVar varbinary(max) " +
                                        @"SET @Var = CAST('<' + '{0}' + '>' + '{1}' AS nvarchar(256)) " +
                                        @"SET @BinVar = convert(varbinary(max), @Var) " +
                                        @"SET CONTEXT_INFO @BinVar";

            var windowsIdentity = WindowsIdentity.GetCurrent();
            var user = LoginUser;
            var context = user != null ? user.id : (long?)null;

            var cmd = connection.CreateCommand();
            cmd.CommandText = String.Format(COMMAND_TEXT, context.HasValue ? context.Value.ToString() : string.Empty, windowsIdentity != null ? windowsIdentity.Name : string.Empty);

            cmd.ExecuteNonQuery();
        }


alexeyvg
И вообще, я не понимаю, connection.Open() - открывает коннект.
ДО этого проверяется статус коннекта - если он открыт, делаем запрос...
А потом уже выполняем открытие коннекта :-)

Я вообще не специалист по C#, не программировал на нём уже давно, новые веяния языка прошли мимо меня, так что извините, если что :-)

Эксепшен то на какой строке возникает, на connection.Open()?


То ж - обработчик. Он дергается при смене State connection'а. Т.е. когда connection открывается (его State изменился) - дергается этот метод.

В конечном итоге на сервант уходит
DECLARE
	@Var nvarchar(max),
	@BinVar varbinary(max)

SET @Var = CAST('<' + '0' + '>' + 'SmthUser' AS nvarchar(256))
SET @BinVar = convert(varbinary(max), @Var)
SET CONTEXT_INFO @BinVar
6 фев 15, 12:59    [17227817]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
Konst_One
Member

Откуда:
Сообщений: 11540
'Связывает до 128 байт бинарных данных с текущим сеансом или соединением.

DECLARE @BinVar varbinary(128);
SET @BinVar = CAST(REPLICATE( 0x20, 128 ) AS varbinary(128) );
SET CONTEXT_INFO @BinVar;
6 фев 15, 13:03    [17227849]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Konst_One
'Связывает до 128 байт бинарных данных с текущим сеансом или соединением.

Да я на это уже смотрел. Не в этом дело. Это не единственное соединение, открытое под этим юзвером, до этого и после этого - все сухо. Мало того - приложение находится в промышленной эксплуатации и юзает его довольно-таки довольно большое кол-во людей. И у них все oB!
Это я просто по результатам анализа log'ов приложения пытаюсь разобраться в ситуации. Чел же продолжает фунциклировать дальше. Ошибка не повторяется. Вот я и хочу в голове прокрутить, как можно ее добиться/воссоздать.
6 фев 15, 13:11    [17227921]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Ex_Soft
Угу... Только не запрос, а
Почему не запрос? Это и называется "выполняется запрос к базе данных, методом ExecuteNonQuery"

Ex_Soft
То ж - обработчик. Он дергается при смене State connection'а. Т.е. когда connection открывается (его State изменился) - дергается этот метод.
А, то есть вызывается new SqlConnection(connectionString), потом connection.Open(), а потом, когда статус коннекта меняется, вызывается код SetContext(connection)?
Понятно.

Непонятно, почему так замысловато, почему нельзя написать:
var connection = new SqlConnection(connectionString);
connection.Open();
SetContext(connection);


Вроде и текста меньше нужно вбивать :-)

Ну ладно, неважно. Что то другое, значит :-(
6 фев 15, 13:25    [17228047]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
Ex_Soft
alexeyvg
Эксепшен то на какой строке возникает, на connection.Open()?

То ж - обработчик. Он дергается при смене State connection'а. Т.е. когда connection открывается (его State изменился) - дергается этот метод.
Да, так вы на вопрос не ответили - на какой строке эксепшен случается?
6 фев 15, 13:26    [17228061]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
alexeyvg
Непонятно, почему так замысловато, почему нельзя написать:
var connection = new SqlConnection(connectionString);
connection.Open();
SetContext(connection);

Вроде и текста меньше нужно вбивать :-)
Вот мне просто интересен ваш подход.

При выполнении запросов, на каждый запрос в конце вы выполняете ещё один запрос - установку контекста?

Ведь, как я понимаю, при типичном выполнении любого запроса статус меняется последовательно:
Executing
Fetching (если запрос что то возвращает)
Open

При возврату к статусу "Open" опять вызывается ваш обработчик, т.е. после выполнения любого вашего запроса вы как минимум один раз выполняете в завершение ещё один запрос установки контекста?
Я не ошибаюсь?
6 фев 15, 13:42    [17228240]     Ответить | Цитировать Сообщить модератору
 Re: Error: 4021 Resetting the connection results in a different state than the initial login.  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
alexeyvg
Ведь, как я понимаю, при типичном выполнении любого запроса статус меняется последовательно:
Executing
Fetching (если запрос что то возвращает)
Open

При возврату к статусу "Open" опять вызывается ваш обработчик, т.е. после выполнения любого вашего запроса вы как минимум один раз выполняете в завершение ещё один запрос установки контекста?
Я не ошибаюсь?

https://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.statechange.aspx
DbConnection.StateChange Event

Occurs when the state of the event changes.

The StateChange event occurs when the state of the event changes from closed to opened, or opened to closed.
6 фев 15, 15:03    [17228896]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить