2010-06-12 3 views
9

Je reçois exception: "cast spécifique n'est pas valide", voici le codefonte spécifique n'est pas valable, lors de la récupération SCOPE_IDENTITY

con.Open(); 
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();"; 

SqlCommand cmd = new SqlCommand(insertQuery, con); 
cmd.ExecuteNonQuery(); 
tenderId = (int)cmd.ExecuteScalar(); 
+0

un pour chaque requête? – luke

+1

quel type est tendre? –

+1

Vous réalisez que vous exécutez le SQL deux fois et que vous insérez deux fois l'enregistrement. Exécutez simplement la méthode ExecuteScalar. –

Répondre

20

1) Vous exécutez votre requête deux fois en appelant ExecuteNonQuery et ExecuteScalar. Par conséquent, vous insérerez deux enregistrements dans votre table chaque fois que cette fonction sera exécutée. Votre SQL, tout en étant deux déclarations distinctes, fonctionnera ensemble et donc vous avez seulement besoin de l'appel à ExecuteScalar.

2) Scope_Identity()returns a decimal. Vous pouvez soit utiliser Convert.ToInt32 sur le résultat de votre requête, ou vous pouvez convertir la valeur de retour en décimal, puis en int.

3) Assurez-vous d'envelopper vos objets de connexion et de commande dans les instructions using afin qu'ils soient correctement éliminés. Avez-vous essayé de scinder cela en deux objets SqlCommand?

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    using (SqlCommand command = new SqlCommand(sql, connection)) 
    { 
     connection.Open(); 
     int tenderId = (int)(decimal)command.ExecuteScalar(); 
    } 
} 
2

test le premier suivant:

object id = cmd.ExcuteScalar() 

Définissez un point de rupture et jetez un oeil au type de id. Il s'agit probablement d'un Decimal et ne peut pas être directement converti en int.

+0

Ce n'est pas la colonne ID qui pose problème, c'est la valeur de retour de 'Scope_Identity()'. Mais vous avez raison à propos de la partie décimale. –

1

il a besoin de Convert.ToInt32 (cmd.ExecuteScalar());

5

Essayez ceci: -

con.Open(); 
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();"; 

SqlCommand cmd = new SqlCommand(insertQuery, con); 
tenderId = Convert.ToInt32(cmd.ExecuteScalar()); 

EDIT

Il devrait être ce qu'il est correctement fait remarquer que SCOPE_IDENTITY() retourne une valeur numérique (38,0): -

tenderId = Convert.ToInt32(cmd.ExecuteScalar()); 

Remarque: Vous devez toujours supprimer le: -

Par souci d'exhaustivité, il existe trois problèmes avec votre exemple de code:
cmd.ExecuteNonQuery(); 
+4

'Scope_Identity()' renvoie un nombre décimal. La conversion directe ne fonctionnera pas, mais une double conversion aura '(int) (décimal) cmd.ExecuteScalar()' ou utilisera simplement 'Convert.ToInt32'. –

+0

@anthony, oui vous avez raison, Cela fait longtemps que j'ai utilisé ce type de code – Rippo

Questions connexes