Несоответствие типа SqlGeography

При написании внутреннего API я столкнулся со следующей ошибкой. То, что я пытаюсь сделать, это прочитать значение SqlGeography (SQL Server 2012) следующим образом:

 field: public SqlGeography XY { get; set; } object dbValue = reader["xy"]; PropertyInfo info = type.GetProperty(columnName:"xy"); info.SetValue(entity, dbValue); 

Теперь, хотя это может показаться странным, причина, по которой я читаю таким образом, состоит в том, что она является частью Wrapper, которую я написал, которую мы используем для ускорения чтения и записи sql. Он принимает анонимный объект и считывает в него все значения sql, основанные либо на именах свойств, либо на именах атрибутов.

Это отлично SqlGeography для всего, кроме SqlGeography . Я сделал сравнение типов, и он терпит неудачу так же, как и взломанный, поскольку я даже не могу выполнить проверку, чтобы увидеть, имеет ли столбец тип SqlGeography поскольку он всегда терпит неудачу в сравнении с Microsoft.SqlServer.Types.SqlGeography .

Исходное исключение выглядит следующим образом:

Объект типа «Microsoft.SqlServer.Types.SqlGeography» не может быть преобразован в t ype «Microsoft.SqlServer.Types.SqlGeography».

Если что-то неясно, тогда уберите его, и я постараюсь уточнить.

Благодаря!

  • Принятое решение: Install-Package Microsoft.SqlServer.Types -Version 10.50.1600.1

У вас может быть несоответствие версии для сборки типов. Это была известная проблема между версиями 10 и 11. К сожалению, сообщение об ошибке не содержит информации о версии, поэтому она выглядит глупостью!

Чтобы обойти это, вы можете десериализовать двоичное представление типа, то есть что-то вроде этого (если столбец географии является первым в наборе результатов):

 var geo = SqlGeography.Deserialize(reader.GetSqlBytes(0)); 

Существуют и другие способы обхода, включая выполнение переадресации привязки для сборки.

Подробнее здесь: https://connect.microsoft.com/SQLServer/feedback/details/685654/invalidcastexception-retrieving-sqlgeography-column-in-ado-net-data-reader

я использую

 DataTable dt; //... dt.Load(reader) 

для загрузки всех строк из таблицы sql в DataTable, поэтому я не могу использовать решение, предложенное Dave R. Моим решением является изменение запроса выбора sql, используемого для создания SqlDataReader, для преобразования столбца SqlGeography в строку. пример:

Исходный sql-запрос:

 SELECT [SpatialColumn] as SpatialData FROM [SpatialTable] 

Измененный SQL-запрос:

 SELECT [SpatialColumn].STAsText() as SpatialData FROM [SpatialTable] 

то вам нужно изменить свой код c #, чтобы проанализировать строку в реальной SqlGeography следующим образом:

 using Microsoft.SqlServer.Types.SqlGeography; string spatialData = (string) dt.Rows[0]["SpatialData"]; SqlGeography geoGraphy = SqlGeography.Parse(new System.Data.SqlTypes.SqlString(spatialData )); 

Anben.