C # cmd.ExecuteScalar (): "Impossible de poursuivre l'exécution car la session est à l'état" kill ".

Obtenir une exception étrange de ExecuteScalar() laquelle je ne trouve aucune aide sur le web:

Impossible de poursuivre l'exécution car la session est à l'état d'arrêt.

J'utilise SqlConnection / SqlCommand

La command est un INSERT INTO de base … avec 105 colonnes (et 105 parameters pour définir datatables de la colonne) suivi d'un SELECT SCOPE_IDENTITY ();

J'ai vérifié la string de connection – c'est correct et la connection est ouverte.

Je ne suis même pas sûr de ce que cette erreur me dit de savoir où commencer à regarder celui-ci.

Alors, que signifie exactement cette erreur? Comment une session passe-t-elle à l'état de kill pour commencer?

Le code est assez simple:

 using (SqlConnection conn = new SqlConnection(connSsortingng)) { conn.Open(); using (SqlCommand cmd = new SqlCommand(@"INSERT INTO VendorNote (VendorId, AdminComment...) VALUES (@VendorId, @AdminComment, ...); SELECT SCOPE_IDENTITY(); ", conn)) { cmd.Parameters.AddWithValue("@VendorId", VendorId); cmd.Parameters.AddWithValue("@AdminComment", AdminComment); Id = (int) cmd.ExecuteScalar(); } } 

TROUVEZ-LE!

Une violation de contrainte dans la requête entraînait l'échec de l'exécution de la requête. Au lieu de rapporter cette information dans l'exception – cela indiquait que la session était dans un "état de destruction" (je devine) parce que la requête était terminée prématurément.

Je n'ai jamais vu cette erreur auparavant – normalement les erreurs de contraintes et autres ont quelque chose de plus utile dans l'exception.

Donc, tout le monde qui obtient cette erreur – VRAIMENT vérifier votre requête pour s'assurer que c'est valide.

Votre code devrait ressembler à ceci:

 const ssortingng sqlSsortingng = "INSERT INTO dbo.Table ( ....) " + " VALUES ( .... );" + "SELECT SCOPE_IDENTITY();"; using (conn) { using (var cmd = new SqlCommand(sqlSsortingng, conn)) { cmd.Parameters.AddWithValue("@param", param); cmd.CommandType = CommandType.Text; conn.Open(); return (int) (decimal) cmd.ExecuteScalar(); } } 

Mais notez parfois qu'une procédure stockée sera plus appropriée