C# 通过ado.net插入DBGeography类型的正确方法是什么
我试图通过ado.net插入C# 通过ado.net插入DBGeography类型的正确方法是什么,c#,sql-server,entity-framework,ado.net,sqlgeography,C#,Sql Server,Entity Framework,Ado.net,Sqlgeography,我试图通过ado.net插入DBGeography类型,但没有成功。 这是我得到的错误: 对象类型中不存在映射 System.Data.Entity.Spatial.DbGeography发送到已知的托管提供程序 本地类型 或: 指定的类型未在目标上注册 server.System.Data.Entity.Spatial.DbGeography、EntityFramework、, 版本=6.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089 这是我从db获得
DBGeography
类型,但没有成功。这是我得到的错误: 对象类型中不存在映射 System.Data.Entity.Spatial.DbGeography发送到已知的托管提供程序 本地类型 或: 指定的类型未在目标上注册 server.System.Data.Entity.Spatial.DbGeography、EntityFramework、, 版本=6.0.0.0,区域性=中性,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);
但是insert不起作用:
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);
这里怎么了?
DbGeography
是为EntityFramework
而不是ADO.NET
设计的类型。尝试用方法将一个众所周知的文本模块解析为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;博士:
众所周知的文本(WKT)是一个开放的地理空间联盟(OGC)标准
用于以文本格式表示空间数据的。最
OGC兼容系统支持众所周知的文本。空间功能
在SQL Server 2008、2012和SQL Azure中,可以轻松地在
数据库和WKT中的空间对象。WKT只能存储
单个空间对象的信息和此空间数据格式
通常用作更大文件格式或web服务的一部分
答复。以下是每种几何图形类型的示例
表示为已知文本和等效的Bing Maps类
在解析已知文本字符串时生成
添加这些组件
System.Data.SqlClient;System.Data.SqlTypes;System.Data.SqlServer.Types
我认为地理是错误的(小写)
extensts.UdtTypeName=“地理”强>
p、 UdtTypeName=“地理”;
或Location=DbGeography.FromText(“点(-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);
您尝试过这个吗?我尝试过stackverflow的所有解决方案,但都没有成功。错误是“指定的类型未在目标服务器上注册”,似乎缺少一些包。你试过重新安装吗?你查过这个链接了吗你解决过这个问题吗?您是否可以尝试使用Microsoft.SqlServer.Types而不是System.Data.Entity…。通过使用,您可以避免生成命令时的所有猜测。同样,您可以通过使用。对不起,双链接…:O)我在实施此方法时面临以下问题。。。