通过ado.net插入DBGeography类型的正确方法是什么

时间:2015-01-08 10:36:01

标签: c# sql-server entity-framework ado.net sqlgeography

我试图通过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);

这里有什么问题?

2 个答案:

答案 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类,   是在解析知名文本字符串时生成的。

Wellknown text module

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