我试图通过ado.net插入DBGeography
类型,但没有运气
这是我得到的错误:
对象类型不存在映射 System.Data.Entity.Spatial.DbGeography到已知的托管提供程序 本地类型。
或:
目标上未注册指定的类型 server.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);
这里有什么问题?
答案 0 :(得分:6)
DbGeography
是为EntityFramework
而非ADO.NET
设计的类型。尝试通过SqlGeography.Parse(SqlString)方法将知名文本模块解析为SqlGeography
,这应该可以解决您的问题。
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
知名文本(WKT)是开放地理空间联盟(OGC)的标准 用于以文本格式表示空间数据。最 符合OGC的系统支持熟知文本。空间功能 在SQL Server 2008、2012和SQL Azure中可以轻松地在 数据库和WKT中的空间对象。 WKT只能存储 单个空间对象的信息以及此空间数据格式 通常用作较大文件格式或Web服务的一部分 响应。以下是每种几何类型的示例 表示为“众所周知的文本”和等效的Bing Maps类, 是在解析知名文本字符串时生成的。
答案 1 :(得分: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);