10

我正在尝试DBGeography通过 ado.net 插入类型,但没有运气。
这是我得到的错误:

不存在从对象类型 System.Data.Entity.Spatial.DbGeography 到已知托管提供程序本机类型的映射。

或者:

指定类型未在目标服务器上注册。System.Data.Entity.Spatial.DbGeography,EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089。

这就是我从 db 获取它时所做的事情,并且效果很好:

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);

这里有什么问题?

4

2 回答 2

10

DbGeography是为EntityFrameworknot设计的类型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;博士:

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

众所周知的文本 (WKT) 是一种开放地理空间联盟 (OGC) 标准,用于以文本格式表示空间数据。大多数符合 OGC 的系统都支持众所周知的文本。SQL Server 2008、2012 和 SQL Azure 中的空间功能可以轻松地在数据库中的空间对象和 WKT 之间进行转换。WKT 只能存储单个空间对象的信息,并且这种空间数据格式通常用作较大文件格式或 Web 服务响应的一部分。以下是表示为众所周知文本的每种几何类型的示例以及在解析知名文本字符串时生成的等效 Bing 地图类。

知名文本模块

于 2019-07-06T06:14:35.110 回答
1

添加那些组件 System.Data.SqlClient; System.Data.SqlTypes;System.Data.SqlServer.Types;

我认为地理是错误的(小写)。

extents.UdtTypeName = "地理";

p.UdtTypeName = "地理"; 或 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);
于 2019-07-08T14:02:11.137 回答