2013-11-14 2 views
1

я наткнулся на эту вещь сегодня:Странное поведение с SqlDataReader и длинными колоннами

У меня есть небольшой вспомогательный метод со следующим:

private static T GetValOrDefault<T>(this IDataRecord rdr, string name) 
{ 
    return rdr[name] is T ? (T) rdr[name] : default(T); 
} 

и все мои модели используют public long Id { get; set; }

SQL сервер столбцы BIGINT

Как-то GetValOrDefault<long>("Id") возвращает '0', и я пошел вперед и использовал Immediate W indow, и посмотрел rdr["Id"].GetType()

Это было Int32 ... любые идеи, почему это происходит? Везде я смотрю, он говорит BIGINT = INT64 = long ... и как-то SqlDataReader дает мне int32 ...

Edit:
Это мой Sql запрос:

SELECT 
     Id, 
     Created, 
     CreatedById, 
     LastModified, 
     LastModifiedById, 
     Deleted, 
     DeletedById 
    FROM dbo.MyTable 
    WHERE Id = @id 

ответ

2

Столбец BIGINT следует возвращать как длинный. Я подозреваю, что в вашем коде есть ошибка - возможно, вы не получаете столбец, который, как вы думаете, из базы данных, которую, по вашему мнению, используете, или, возможно, ваш SQL-запрос линяет значение столбца.

+0

Вы были правы, я использовал временную таблицу с 'DECLARE @temp AS TABLE (Id int' – Nefarion

1

ваш может использовать Convert.ChnageType реализовать

public T Change<T>(IDataReader rd,string fieldName) 
{ 
    return (T)Convert.ChangeType(rd[fieldName], typeof(T)); 
} 
Смежные вопросы