2015-12-29 3 views
4

Obtenir une exception étrange de ExecuteScalar() que je ne peux trouver aucune aide sur le web:C# cmd.ExecuteScalar(): "Impossible de poursuivre l'exécution car la session est à l'état" kill ".

ne peut pas continuer l'exécution parce que la session est dans l'état kill.

J'utilise SqlConnection/SqlCommand

La commande est un insert de base INTO ... avec 105 colonnes et 105 (paramètres pour définir les données de colonne) suivi d'un SELECT SCOPE_IDENTITY();

J'ai vérifié la chaîne de connexion - c'est correct et la connexion est ouverte.

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

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

code est assez simple:

using (SqlConnection conn = new SqlConnection(connString)) 
{ 
    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(); 
    } 
} 
+6

Créez-vous simplement la connexion pour cette commande ou essayez-vous de partager la connexion entre plusieurs opérations? –

+2

Pouvez-vous montrer le code? –

+0

Ce n'est pas un problème avec la chaîne de connexion ou la syntaxe de requête. Même si je remplace ma requête par une simple instruction select, j'obtiens cette erreur. Aussi - en utilisant cette chaîne de connexion partout dans l'application avec succès. Donc, d'une façon ou d'une autre, la session doit être corrompue ou quelque chose comme ça. Je suis de retour traçant le code qui est exécuté avant cela maintenant pour voir si je ne peux pas le réduire. –

Répondre

1

Votre code devrait ressembler à ceci:

const string sqlString = "INSERT INTO dbo.Table (....) " + 
         "    VALUES (....);" + 
         "SELECT SCOPE_IDENTITY();"; 
using (conn) 
{ 
    using (var cmd = new SqlCommand(sqlString, conn)) 
    { 
     cmd.Parameters.AddWithValue("@param", param); 

     cmd.CommandType = CommandType.Text; 
     conn.Open(); 
     return (int) (decimal) cmd.ExecuteScalar(); 

    } 
} 

Mais notez quelque temps une procédure stockée sera plus approprié

6

Je l'ai trouvé!

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 contrainte ont quelque chose de plus utile dans l'exception.

Donc, n'importe qui recevant cette erreur - vérifiez vraiment votre requête pour vous assurer qu'elle est valide.