2014-02-07 3 views
1

enter image description hereПочему этот указанный состав недействителен?

Я использую следующий код для сопоставления данных из SQL-считывателя с объектами C#. Power имеет тип данных типа float как в базе данных кода, так и в sql. y - это сообщение об ошибке литья?

private Entity.PanelDetail MapDataReader(SqlDataReader dataReader) 
    { 
     Entity.PanelDetail panelDetail = new Entity.PanelDetail(); 
     panelDetail.IdPanelDetail = DataReaderExtensions.GetStringOrNull(dataReader, "idPanelDetail"); 
     panelDetail.IdDeviceDetail = DataReaderExtensions.GetStringOrNull(dataReader, "idDeviceDetail"); 
     panelDetail.Power = DataReaderExtensions.GetFloatOrNull(dataReader, "Power"); 
     panelDetail.Current = DataReaderExtensions.GetFloatOrNull(dataReader, "Current"); 
     panelDetail.Length = DataReaderExtensions.GetFloatOrNull(dataReader, "Length"); 
     panelDetail.Width = DataReaderExtensions.GetFloatOrNull(dataReader, "Width"); 
     panelDetail.CreatedBy = DataReaderExtensions.GetStringOrNull(dataReader, "CreatedBy"); 
     panelDetail.CreationDate = DataReaderExtensions.GetDateTimeOrNull(dataReader, "CreationDate"); 
     panelDetail.ModifiedBy = DataReaderExtensions.GetStringOrNull(dataReader, "ModifiedBy"); 
     panelDetail.ModifiedDate = DataReaderExtensions.GetDateTimeOrNull(dataReader, "ModifiedDate"); 
     panelDetail.IsActive = DataReaderExtensions.GetBoolOrNull(dataReader, "IsActive"); 
     panelDetail.IsDeleted = DataReaderExtensions.GetBoolOrNull(dataReader, "IsDeleted"); 

     return panelDetail; 
    } 
+0

возможно дубликат [Почему SQL-поплавок отличается от C# поплавка] (http://stackoverflow.com/questions/122523/why-is-a-sql-float-different-from-ac- sharp-float) – Leo

ответ

8

Мое предположение, что значение возвращается в виде бокса double вместо float. Попробуйте использовать

(float) dataReader.GetDouble(fieldOrdinal); 

См Mapping CLR Parameter Data

+0

, что означает, что мне также придется изменить все атрибуты, чтобы удвоить мой код? –

+0

Как сказал Джей. – Sameer

+0

поэтому, если я изменяю все атрибуты на double и использую GetDoubleOrNull, тогда я dun должен использовать тип cast: (float) dataReader.GetDouble (fieldOrdinal) ryt? –

4

Я бы сделал хорошую ставку, что возвращаемый тип данных на самом деле является двойным (в штучной упаковке).

Update: На самом деле я только что обнаружил, что SQL поплавок карты к .NET дубля на MSDN (да так это ваша проблема): http://msdn.microsoft.com/en-us/library/ms131092.aspx

Попробуйте это как тест:

(float)dataReader.GetDouble(fieldOrdinal);

+0

Jay, я должен изменить все атрибуты, чтобы удвоить в моем коде ??? –

+0

Да, вы должны – Leo

+0

@ Sana.91 Да, я бы порекомендовал это. – Timeout

2

Причина заключается в том, что SQL Float вдвое в .net. Вы можете увидеть полное отображение here. Поэтому, как предложили другие, вам нужно прочитать double, а затем попытаться применить его к float.

(float)dataReader.GetDouble("Power"); 
Смежные вопросы