2010-04-08 6 views
73

Así que tengo una tabla con una columna de identidad como clave principal, por lo que es un número entero. Entonces, ¿por qué SCOPE_IDENTITY() siempre devuelve un valor decimal en lugar de un int a mi aplicación C#? Esto es realmente molesto ya que los valores decimales no se convertirán implícitamente en enteros en C#, lo que significa que ahora tengo que reescribir un montón de cosas y tener muchos métodos auxiliares porque uso SQL Server y Postgres, que Postgres devuelve un entero para el función equivalente ..¿Por qué seleccionar SCOPE_IDENTITY() devuelve un decimal en lugar de un entero?

¿Por qué SCOPE_IDENTITY() no solo devuelve un número entero simple? ¿Hay personas que comúnmente usan valores decimales/no identitarios para las claves primarias?

Respuesta

84

En SQL Server, la propiedad puede IDENTITY Asignar a tinyint, smallint, int, bigint, decimal(p, 0), o numeric(p, 0) columnas. Por lo tanto, la función SCOPE_IDENTITY debe devolver un tipo de datos que pueda abarcar todo lo anterior.

Como las respuestas anteriores han dicho, simplemente transfiéralo a int en el servidor antes de devolverlo, luego ADO.NET detectará su tipo como espera.

+1

No sabía que podría tener nada más que int y bigint para una clave principal. – Earlz

+0

El valor de retorno de la función 'SCOPE_IDENTITY' es *** decimal (38,0) *** – Kiquenet

27

¿No puedes simplemente echarlo antes de devolverlo de tu consulta o de tu proc almacenado (los SPs siempre devuelven int de todos modos, pero tal vez estés usando un parámetro de salida)?

Como SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

Y por qué se hace esto? Probablemente para ser más flexible y manejar números más grandes.

+0

'SCOPE_IDENTITY' es una función integrada .. así que cuando se hace como' ExecuteScalar ('insertar ...; seleccione SCOPE_IDENTITY()) ; 'devolverá un decimal de esa función en lugar de la int esperada. – Earlz

+0

@Earlz, entonces cambie el SQL a ExecuteScalar ('insert ...; select CAST (scope_identity() AS int)'); –

3

Scope identity valor de retorno es decimal (38,0)

echaron, utilice la cláusula OUTPUT, o asignar a un parámetro de salida en lugar de SELECT SCOPE_IDENTITY() al cliente

3

intenta usar este y obtendrá un número entero de vuelta:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())'); 
Cuestiones relacionadas