Разве 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
то есть они, похоже, компилируются в идентичный код.