Разве Int64 не равен long в C #? - PullRequest
28 голосов
/ 10 марта 2011

Я играл с SQL и базами данных в C # через SqlCeConnection .Я использую ExecuteReader для чтения результатов и BigInt значения для идентификаторов записей, которые считываются в Long.

Сегодня я играл с операторами SQL, которые используют основанные на COUNTоператоры ('SELECT COUNT (*) FROM X')) и использовали ExecuteScalar для чтения этих однозначных результатов.

Однако я столкнулся с проблемой.Я не могу сохранить значения в тип данных Long, который я использовал до сих пор.Я могу сохранить их в Int64.

Я использовал BigInt для идентификаторов записей, чтобы получить максимальное потенциальное количество записей.

Следовательно, 8 байтов BigInt являются Int64.Разве Long не равен Int64, поскольку оба являются 64-битными целыми числами со знаком?

Поэтому, почему я не могу привести Int64 в Long?

long recordCount =0;

recordCount = (long)selectCommand.ExecuteScalar();

Ошибка:

Указанный состав недействителен.

Я могу прочитать BigInt в Long.Это не проблема.Я не могу прочитать SQL COUNT в long.

COUNT возвращает Int (Int32), поэтому проблема на самом деле заключается в преобразовании Int32 в long.

Ответы [ 2 ]

28 голосов
/ 10 марта 2011

long - это Int64 в .NET ; это просто псевдоним в C #. Ваша проблема заключается в приведении возвращаемого значения к long, и если мы точно не знаем тип, возвращаемый из вашего запроса, мы не узнаем, почему вы получили ошибку. SQL BigInt должен быть конвертируемым в long.

Если возвращается COUNT (*), то это Int32. Вам необходимо использовать Convert класс:

long l = Convert.ToInt64(selectCommand.ExecuteScalar());
5 голосов
/ 10 марта 2011

Если вы думаете, что ваши подсчеты переполняют int / Int32, вам следует вместо этого использовать COUNT_BIG () в вашем SQL - он имеет правильный тип возврата.


Что касается того, почему забросы не работают, я не уверен.Следующий C #:

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

Компилируется в этот 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 

То есть они, похоже, компилируются в идентичный код.

...