Как правильно вставить тип DBGeography через ado.net

Я пытаюсь вставить тип DBGeography через ado.net, но безуспешно.
Я получаю следующие ошибки:

Отсутствует сопоставление типа объекта System.Data.Entity.Spatial.DbGeography с собственным типом известного управляемого поставщика.

or:

Указанный тип не зарегистрирован на целевом сервере.

Вот что я делаю, когда получаю его из БД, и это отлично работает:

dynamic temp = reader.GetValue(3);

                var text = string.Format("POINT({0:R} {1:R})", temp.Long, temp.Lat);
                var srid = temp.STSrid.Value;
                this.Coordinates = System.Data.Entity.Spatial.DbGeography.PointFromText(text, srid);

Но вставка не работает:

updateCommand.Parameters.AddWithValue("@Coordinates", store.Coordinates);
// or ...
SqlParameter p = new SqlParameter();
                    p.ParameterName = "@Coordinates";
                    p.Value = store.Coordinates;
                    p.SqlDbType = System.Data.SqlDbType.Udt;
                    p.UdtTypeName = "geography";
                    updateCommand.Parameters.Add(p);

Что здесь не так?


person 1110    schedule 08.01.2015    source источник
comment
Вы пробовали этот заголовок stackoverflow.com/questions/15061227/   -  person JunaidKirkire    schedule 08.01.2015
comment
Я пробовал все решения здесь из stackverflow, но ни одно не сработало.   -  person 1110    schedule 08.01.2015
comment
Из ошибки Указанный тип не зарегистрирован на целевом сервере, видно, что какой-то пакет отсутствует. Вы пробовали переустановить? Вы проверяли эту ссылку? - github.com/Glimpse/Glimpse/issues/646   -  person JunaidKirkire    schedule 08.01.2015
comment
Вы когда-нибудь решали это? Не могли бы вы попробовать использовать Microsoft.SqlServer.Types вместо System.Data.Entity....   -  person Josiah Peters    schedule 09.06.2015
comment
Вы можете избежать всех догадок при создании команды, используя SqlCommandBuilder. Точно так же вы можете избежать всех уродливых манипуляций со строками, используя SqlGeographyBuilder. Извините за двойную ссылку... :О)   -  person jsanalytics    schedule 07.07.2019
comment
Привет, я столкнулся с приведенным ниже исключением при добавлении типа SQLGeography в качестве параметра SQL command.parameter для хранения процедуры. Specified type is not registered on the target server.Microsoft.SqlServer.Types.SqlGeography command.Parameters.Add(new SqlParameter("@deviceGeolocation", SqlDbType.Udt) { UdtTypeName = "Geography", Value = geo, }); здесь   -  person Shailendra    schedule 05.10.2020


Ответы (2)


DbGeography — это тип, предназначенный для EntityFramework, а не ADO.NET. Попробуйте разобрать хорошо известный текстовый модуль на SqlGeography с помощью SqlGeography.Parse(SqlString), это должно решить вашу проблему.

dynamic temp = reader.GetValue(3);
var text = string.Format("POINT({0:R} {1:R})", temp.Long, temp.Lat);
var coordinate= SqlGeography.Parse(text );

SqlParameter p = new SqlParameter();
                 p.ParameterName = "@Coordinates";
                 p.Value = coordinate;
                 p.SqlDbType = System.Data.SqlDbType.Udt;
                 p.UdtTypeName = "geography";

updateCommand.Parameters.Add(p);

TL;DR:

https://docs.microsoft.com/en-us/bingmaps/v8-web-control/modules/well-known-text-module

Well Known Text (WKT) — это стандарт Open Geospatial Consortium (OGC), который используется для представления пространственных данных в текстовом формате. Большинство OGC-совместимых систем поддерживают общеизвестный текст. Пространственные функции в SQL Server 2008, 2012 и SQL Azure могут легко преобразовываться между пространственным объектом в базе данных и WKT. WKT может хранить информацию только для одного пространственного объекта, и этот формат пространственных данных обычно используется как часть более крупного формата файла или ответа веб-службы. Ниже приведены примеры каждого из типов геометрии, представленных как общеизвестный текст, и эквивалентный класс Bing Maps, который создается при разборе строки общеизвестного текста.

Известный текстовый модуль

person Ali Bahrami    schedule 06.07.2019
comment
При реализации этого подхода я столкнулся с проблемой ниже... stackoverflow.com/questions/64205007/ - person Shailendra; 05.10.2020

Добавьте эти СБОРКИ System.Data.SqlClient; Система.Данные.SqlTypes; Система.Данные.SqlServer.Типы;

Я думаю, что география неверна (нижний регистр).

extents.UdtTypeName = "География";

p.UdtTypeName = "geography"; или Location = DbGeography.FromText("POINT(-122,360 47,656)")

Попробуй это

public void InsertArea(string nameParameter, string extentsString)
{
       SqlConnection sqlConn = new SqlConnection(...)

       sqlConn.Open();

       SqlCommand sqlCom = new SqlCommand("INSERT INTO areas (name, extents) VALUES (@name, @extents)", sqlConn);

       sqlCom.Parameters.AddWithValue("@name", nameParameter);

       SqlParamater extents = new SqlParameter("@extents", SqlDbType.Udt);
       extents.UdtTypeName = "Geography";
       extents.Value = GetGeographyFromText(extentsString);

       sqlCom.Parameters.Add(extents);

       sqlCom.ExecuteNonQuery();

       sqlConn.Close();
}

public SqlGeography GetGeographyFromText(String pText)
{
       SqlString ss = new SqlString(pText);
       SqlChars sc = new SqlChars(ss);
       try
       {
           return SqlGeography.STPolyFromText(sc, 4326);
       }
       catch (Exception ex)
       {
           throw ex;
       }
}


 string areaName = "Texas";
       string extents = string.Format("POLYGON(({0} {1}, {0} {2}, {3} {2}, {3} {1}, {0} {1}))", leftLongitude, upperLatitude, lowerLatitude, rightLongitude));

       InsertArea(areaName, extents);
person Jin Thakur    schedule 08.07.2019