Я исхожу из двух других вопросов и пытаюсь понять, почему происходит это исключение.
Начальное значение Entity Framework -> SqlException: сброс соединения приводит к состоянию, отличному от первоначальный логин. Ошибка входа в систему. results-in-a-dif
Что означает сброс соединения? System.Data.SqlClient.SqlException (0x80131904)
Этот код воспроизводит исключение.
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
в контексте той же базы данных.
Что означает сброс соединения? Почему сеанс находится в состоянии уничтожения. ? Следует ли мне избегать выполнения инструкций ALTER внутри одной и той же базы данных? Почему?
SqlConnection.ClearAllPools();
после изменения базы данных. - person Dan Guzman   schedule 03.09.2020ALTER DATABASE
со строкой подключения к этой базе данных приводит к тому, чтоSqlConnection
переходит в плохое состояние. Поскольку оно объединено в пул, следующее использование этого соединения завершится ошибкой. - person pitermarx   schedule 04.09.2020PRINT
с ado.net. Но если вы просто хотите напечатать сообщение, почему бы вам не использовать Console.WriteLine? - person Felipe Oriani   schedule 04.09.2020