¿Qué significa "Restablecer la conexión"? System.Data.SqlClient.SqlException (0x80131904)

Sep 03 2020

Sé que esto es un poco vago, pero no puedo identificar el problema.

Cuando ejecuto un poco de código en una base de datos local, funciona bien. Cuando utilizo una base de datos remota, aparece un error. Ocurre a mitad de camino de la ejecución del programa. La actualización de DBup se ejecuta y luego falla una consulta manual con esta excepción:

System.Data.SqlClient.SqlException (0x80131904): restablecer la conexión da como resultado un estado diferente al inicio de sesión inicial. El inicio de sesión falla. Error de inicio de sesión para el usuario 'sa'.

Estoy creando SqlConnectionmanualmente usando new SqlConnection()y también estoy usando DbUp

No estoy seguro de qué puedo estar haciendo mal. Ni por dónde empezar a depurar esto. El ConnectionStringno cambia y siempre lo estoy usando sapara conectarme a la base de datos.

Una buena pregunta para comenzar es ¿Qué significa "Restablecer la conexión"? Como lo estoy haciendo

Respuestas

pitermarx Sep 03 2020 at 21:48

Después de un par de horas de prueba y error, llegué a un fragmento mínimo de código que reproduce el error.

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();
}

El seguimiento de pila completo es

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()
...

Si cambio de la primera Run(dbName...a la Run("master"...que funciona muy bien. Entonces está relacionado con la ejecución ALTER DATABASEen el contexto de la misma base de datos.