Разве Int64 не равен long в C#?

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

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

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

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

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

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

long recordCount =0;

recordCount = (long)selectCommand.ExecuteScalar();

ошибка:

указанное приведение недопустимо.

Я могу прочитать BigInt в длинный. Это не проблема. Я не могу прочитать количество SQL в long.

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

2 ответов


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

если это счетчик (*), который возвращается, то это Int32. Вам нужно использовать Convert класс:

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

Если вы думаете, что ваши счетчики будут переполнять 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 

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