2009-10-03 6 views
1

J'ai eu un problème étrange, voici la configuration:Pourquoi ai-je reçu InvalidCastException lors de la conversion de l'objet en entier?

ASP.NET 3.5 application/MSSQLSERVER 2008 back-end.

J'ai appelé ExecuteScalar de mon code, qui a renvoyé un objet, alors j'ai essayé coulée cet objet à int (j'ai en fait une méthode générique

T ConvertDBValue<T>(object o) {...} 

, mais ce n'est pas aussi important).

ExecuteScalar frappe la sproc suivante:

... 
insert into ... 
select scope_identity() 

Ma clé primaire est un champ d'identité, et est revenu 85. La prochaine chose que je suis arrivé est InvalidCastException essayer de jeter 85 int.

La solution était de créer explicitement une variable INT, et attribuer SCOPE_IDENTITY() à lui avant de le retourner de la sproc comme suit:

... 
DECLARE @x int 
insert into ... 
select @x = scope_identity() 
select @x 

quelqu'un peut me dire quel était le problème avec ma première approche, et pourquoi ne jetterait-il pas 85 à int?

Répondre

6

scope_identity() retourne en fait un (TSQL) BIGINT (je l'ai été pris par cela avant!)

Donc, votre code a essayé de jeter un BIGINT à un int.

+0

où est-ce documenté? –

+0

Voir la section dans le lien qui dit les types de retour ... –

+0

Il dit qu'il renvoie 'numeric (38,0)', pas 'bigint'? D'une manière ou d'une autre, vous pouvez contourner ceci de quelques manières, soit dans votre code, soit dans le SQL. Dans le SQL, vous pouvez le faire 'SELECT CAST (SCOPE_IDENTITY() comme int)', ou dans votre C#, vous pouvez le faire 'int x = Convert.ToInt32 (quelquechose)'. Mais, comme l'a découvert l'affiche originale, l'utilisation de paramètres de sortie ou de retour annulerait bien sûr la nécessité de ce ... – Funka

Questions connexes