Разве Int64 не равен длине в С#?
Я играл с SQL и базами данных на С# через SqlCeConnection. Я использовал ExecuteReader для чтения результатов и BigInt значения для идентификаторов записей, которые считываются в Longs.
Сегодня я играю с операторами SQL, которые используют инструкции на основе COUNT ( "SELECT COUNT (*) FROM X" ) и использовали ExecuteScalar, чтобы прочитать эти однозначные результаты.
Однако я столкнулся с проблемой. Я не могу хранить значения в формате Long, который я использовал до сих пор. Я могу сохранить их в Int64.
Я использую BigInt для идентификаторов записей, чтобы получить максимально возможное количество записей.
BigInt 8 байтов, следовательно, является Int64. Не является ли Long равным Int64, поскольку оба являются 64-разрядными целыми знаками?
Поэтому почему я не могу использовать Int64 в Long?
long recordCount =0;
recordCount = (long)selectCommand.ExecuteScalar();
Ошибка:
Указанное внесение недействительно.
Я могу прочитать BigInt в Long. Это не проблема.
Я не могу прочитать SQL COUNT в длинный.
COUNT возвращает Int (Int32), поэтому проблема заключается в том, что Int32 превращается в длинный.
Ответы
Ответ 1
long
Int64
в .NET; это просто псевдоним в С#. Ваша проблема заключается в том, чтобы вернуть возвращаемое значение в long
, и если мы точно не знаем тип, возвращающийся из вашего запроса, мы не знаем, почему вы получаете сообщение об ошибке. SQL BigInt должен быть преобразован в long
.
Если возвращается COUNT (*), то это Int32. Вы должны использовать класс Convert
:
long l = Convert.ToInt64(selectCommand.ExecuteScalar());
Ответ 2
Если вы думаете, что ваш счет будет переполнять int/Int32, вы должны использовать COUNT_BIG() в своем SQL вместо этого - он имеет правильный тип возврата.
Что касается того, почему касты не работают, я не уверен. Следующий С#:
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
То есть они, похоже, компилируются в идентичный код.