2010-10-18 6 views
5

In SQL Server, ID è un numero intero non nullo e un'identità.Quale tipo di dati restituisce il metodo SQLCommand ExecuteScalar()?

Quando eseguo il seguente codice, ottengo un'InvalidCastException sull'ultima riga:

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = _conn; 
cmd.CommandText = @"INSERT INTO [Users] (Name, Email, Password) VALUES (@name, @email, @pass); SELECT SCOPE_IDENTITY()"; 
cmd.Parameters.AddWithValue("@name", newUser.Name); 
cmd.Parameters.AddWithValue("@email", newUser.Email); 
cmd.Parameters.AddWithValue("@pass", newUser.PasswordHash); 
int id = (int)cmd.ExecuteScalar(); 

Qual è ExecuteScalar() tornare qui? Qualunque sia la sua ritorno ha un ToString(), che lo fa apparire come un numero, in modo da questa linea terribile di codice funziona:

int id = Int32.Parse(cmd.ExecuteScalar().ToString()); 
+7

Cosa succede se chiami 'GetType()'? – SLaks

+0

Wow, perché non ci ho pensato? Restituisce un decimale. Grazie. – Patty

risposta

2

Probabilmente tornando un'istanza in scatola di un tipo numerico diverso, come ad esempio long.
A boxed long cannot be converted to int.

È possibile chiamare GetType() sul valore restituito per vedere che tipo è realmente.

+1

Per espandere questa risposta, il tipo di ritorno ExecuteScalar è Object, che significa che qualsiasi tipo di valore è stato inserito nella casella, non è possibile eseguire il cast di un valore di tipo box in qualcosa di diverso dal tipo originale –

0

Dalla fine della sua dichiarazione INSERT

SELECT SCOPE_IDENTITY() 

E 'restituire il valore identità della riga inserita nel [gli utenti] tavolo.

9

SCOPE_IDENTITY() restituisce un codice decimal in codice, altrimenti noto come NUMERIC(38,0) in TSQL.

http://msdn.microsoft.com/en-us/library/ms190315.aspx

Quindi, se volete un cast diretta, si può fare (int)(decimal)cmd.ExecuteScalar();. Tieni presente che una conversione da decimale a int può perdere informazioni nel senso più stretto, quindi tieni solo un consiglio. Ma con la tua colonna Identity come numero intero, la conversione sarà sicura.