【问题标题】:What is the right way to insert DBGeography type via ado.net通过 ado.net 插入 DBGeography 类型的正确方法是什么
【发布时间】:2015-01-08 10:36:01
【问题描述】:

我正在尝试通过 ado.net 插入 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);

但是插入不起作用:

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

这里有什么问题?

【问题讨论】:

  • 我已经尝试了 stackverflow 的所有解决方案,但都没有成功
  • 从错误“指定类型未在目标服务器上注册”,似乎缺少某些包。您是否尝试重新安装?你检查了这个链接吗? - github.com/Glimpse/Glimpse/issues/646
  • 你解决过这个问题吗?您可以尝试使用 Microsoft.SqlServer.Types 而不是 System.Data.Entity ....
  • 您可以使用SqlCommandBuilder 避免构建命令的所有猜测。同样,您可以使用SqlGeographyBuilder 避免字符串操作的所有丑陋。对不起,双重链接......:O)

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


【解决方案1】:

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 服务的一部分 回复。以下是每种几何类型的示例 表示为 Well Known Text 和等效的 Bing Maps 类 在解析 Well Known Text 字符串时生成。

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多