Вы должны прочитать его как int
через GetInt32
. Вам не нужно указывать его на long
, потому что это может быть сделано неявно с безопасностью по времени выполнения.
Среда выполнение не позволит вам ип-бокса от object
к другому типа данных без первого не-бокса object
на правильный внутренний тип данных независимо от object
есть, то приведение к следующему. Эта особенность не иметь ничего общего с читателями данных:
static void Main(string[] args)
{
int i = 1;
object o = i;
long l = (long)o; // invalid cast, trying to unbox to something other than the original type
l = (long)(int)o; // No invalid cast, un-boxed to int then cast to long.
}
В частности с SqlDataReader
, потому что ваш базовый тип не Int64
, он внутренне пытается не-поле непосредственно к неправильному типу:
internal Int64 Int64 {
get {
ThrowIfNull();
if (StorageType.Int64 == _type) {
return _value._int64;
}
return (Int64)this.Value; // anything else we haven't thought of goes through boxing.
}
// set excluded for brevity
}
taken from http://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlBuffer.cs,1b180f5ee49fc7ee
TL; DR; Сделайте то, что говорится в документации (по рекомендации Харальддюца) и прочитайте правильный ожидаемый тип.
Каков тип вашей второй колонки в db? И какая это ценность? –
Не могли бы вы ввести дополнительную информацию: как схема для таблицы и команда, которую вы выполняете? – Lucian
Можете ли вы опубликовать исключение? У него может быть больше информации. – nos