Cast specifico non valido, durante il recupero di scope_identity

Ricevo un’eccezione: “Cast specifico non è valido”, ecco il codice

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

Nell’interesse della completezza, ci sono tre problemi con il tuo esempio di codice.

1) Si sta eseguendo la query due volte chiamando ExecuteNonQuery e ExecuteScalar . Di conseguenza, verranno inseriti due record nella tabella ogni volta che viene eseguita questa funzione. Il tuo SQL, pur essendo due affermazioni distinte, verrà eseguito insieme e pertanto è necessaria solo la chiamata a ExecuteScalar .

2) Scope_Identity() restituisce un decimale . È ansible utilizzare Convert.ToInt32 sul risultato della query oppure è ansible eseguire il cast del valore restituito in decimale e quindi su int.

3) Assicurati di avvolgere la connessione e di comandare gli oggetti using istruzioni in modo che siano disposte correttamente.

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

Prova questo:-

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

MODIFICARE

Dovrebbe essere questo come è correttamente sottolineato che scope_identity () restituisce un valore numerico (38,0): –

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

Nota: è ancora necessario rimuovere: –

 cmd.ExecuteNonQuery(); 

Prima prova:

 object id = cmd.ExcuteScalar() 

Impostare un punto di interruzione e dare un’occhiata al tipo di id . Probabilmente è un Decimal e non può essere castato direttamente su int .

ha bisogno di Convert.ToInt32 (cmd.ExecuteScalar ());