Que signifie «Réinitialiser la connexion»? System.Data.SqlClient.SqlException (0x80131904)

Sep 03 2020

Je sais que c'est un peu vague, mais je ne suis pas en mesure de cerner le problème.

Lorsque j'exécute un peu de code sur une base de données locale, cela fonctionne bien. Lorsque j'utilise une base de données distante, j'obtiens une erreur. Il se produit au milieu de l'exécution du programme. La mise à niveau de DBup s'exécute, puis une requête manuelle échoue avec cette exception:

System.Data.SqlClient.SqlException (0x80131904): la réinitialisation de la connexion entraîne un état différent de celui de la connexion initiale. La connexion échoue. La connexion a échoué pour l'utilisateur «sa».

Je crée SqlConnectionmanuellement en utilisant new SqlConnection()et j'utilise également DbUp

Je ne suis pas sûr de ce que je peux faire de mal. Ni par où commencer le débogage. Le ConnectionStringne change pas et j'utilise toujours sapour me connecter à la base de données.

Une bonne question pour commencer est: Que signifie "Réinitialiser la connexion"? Comment est-ce que je fais ça?

Réponses

pitermarx Sep 03 2020 at 21:48

Après quelques heures d'essais et d'erreurs, je suis arrivé à un morceau de code minimal qui reproduit l'erreur

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

Le stacktrace complet est

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 je change le premier Run(dbName...à Run("master"...il fonctionne très bien. C'est donc lié à l'exécution ALTER DATABASEdans le contexte de la même base de données