Что означает «Сброс соединения»? System.Data.SqlClient.SqlException (0x80131904)

Sep 03 2020

Я знаю, что это немного расплывчато, но я не могу точно определить проблему.

Когда я запускаю небольшой код в локальной базе данных, он работает нормально. Когда я использую удаленную базу данных, я получаю сообщение об ошибке. Это происходит в середине выполнения программы. Выполняется обновление DBup, а затем ручной запрос завершается ошибкой с этим исключением:

System.Data.SqlClient.SqlException (0x80131904): сброс соединения приводит к состоянию, отличному от состояния первоначального входа в систему. Не удается войти в систему. Ошибка входа для пользователя sa.

Я создаю SqlConnectionвручную с помощью, new SqlConnection()а также использую DbUp

Я не уверен, что делаю неправильно. Ни с чего начать отладку. ConnectionStringНе меняется , и я всегда использовать saдля подключения к базе данных.

Хороший вопрос для начала: что означает «Сброс соединения»? Как я это делаю?

Ответы

pitermarx Sep 03 2020 at 21:48

После пары часов проб и ошибок я получил минимальный фрагмент кода, который воспроизводит ошибку.

string dbName = "TESTDB";
Run("master", $"CREATE DATABASE [{dbName}]"); Run(dbName, $"ALTER DATABASE [{dbName}] COLLATE Latin1_General_100_CI_AS");
Run(dbName, "PRINT 'HELLO'");

void Run(string catalog, string script)
{
    var cnxStr = new SqlConnectionStringBuilder
    {
        DataSource = serverAndInstance,
        UserID = user,
        Password = password,
        InitialCatalog = catalog
    };

    using var cn = new SqlConnection(cnxStr.ToString());
    using var cm = cn.CreateCommand();
    cn.Open();
    cm.CommandText = script;
    cm.ExecuteNonQuery();
}

Полная трассировка стека

Unhandled Exception: System.Data.SqlClient.SqlException: Resetting the connection results in a different state than the initial login. The login fails.
Login failed for user 'user'.
Cannot continue the execution because the session is in the kill state.
A severe error occurred on the current command.  The results, if any, should be discarded.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
...

Если бы я изменить первый Run(dbName...на Run("master"...это работает отлично. Так что это связано с запуском ALTER DATABASEв контексте той же базы данных.