variable sirve reservada que programacion para palabra long flotantes float declaracion c# sql-server-ce long-integer int64 int32

c# - sirve - que es short en c++



¿No es un Int64 igual a un largo en C#? (2)

He estado jugando con SQL y bases de datos en C # a través de SqlCeConnection . He estado usando ExecuteReader para leer los resultados y los valores de BigInt para las ID de registro que se leen en Longs.

Hoy he estado jugando con sentencias de SQL que usan sentencias basadas en COUNT (''SELECT COUNT (*) FROM X'') y he estado utilizando ExecuteScalar para leer estos resultados de valor único.

Sin embargo, me encontré con un problema. Parece que no puedo almacenar los valores en un tipo de datos Long, que he estado usando hasta ahora. Puedo almacenarlos en Int64.

He estado usando BigInt para ID de registro para obtener el máximo número posible de registros.

Un BigInt 8 bytes por lo tanto es un Int64. ¿Un Largo no es igual a un Int64 ya que ambos son enteros con signo de 64 bits?

Por lo tanto, ¿por qué no puedo lanzar un Int64 en un Long?

long recordCount =0; recordCount = (long)selectCommand.ExecuteScalar();

El error es:

El elenco especificado no es válido.

Puedo leer un BigInt en un Long. No es un problema. No puedo leer un recuento de SQL en mucho tiempo.

COUNT devuelve un Int (Int32), por lo que el problema es, de hecho, convertir un Int32 en un largo.


Si está pensando que sus conteos van a desbordar un int / Int32, debería usar COUNT_BIG() en su SQL en su lugar - tiene el tipo de retorno correcto.

En cuanto a por qué los moldes no funcionan, no estoy seguro. El siguiente C #:

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(); long lCount = (long)cmd.ExecuteScalar(); Int64 iCount = (Int64)cmd.ExecuteScalar();

Compila a esta IL:

L_0000: nop L_0001: newobj instance void [System.Data]System.Data.SqlClient.SqlCommand::.ctor() L_0006: stloc.0 L_0007: ldloc.0 L_0008: callvirt instance object [System.Data]System.Data.Common.DbCommand::ExecuteScalar() L_000d: unbox.any int64 L_0012: stloc.1 L_0013: ldloc.0 L_0014: callvirt instance object [System.Data]System.Data.Common.DbCommand::ExecuteScalar() L_0019: unbox.any int64 L_001e: stloc.2 L_001f: ret

Es decir, parecen compilarse a código idéntico.


long es Int64 en .NET ; es solo un alias en C #. Su problema es convertir el valor de retorno en long y, a menos que sepamos con certeza el tipo que regresa de su consulta, no sabremos por qué recibe un error. SQL BigInt debe ser convertible a long .

Si es COUNT (*) el que vuelve, entonces es Int32. Necesitas usar la clase Convert :

long l = Convert.ToInt64(selectCommand.ExecuteScalar());