Подтвердить что ты не робот

Разве 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 превращается в длинный.

4b9b3361

Ответ 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 

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