SQL DBGeography第二次插入失败

时间:2015-06-02 06:16:39

标签: c# sql-server entity-framework sqlgeography

这是一个奇怪的。我试图通过MVC控制器将谷歌地图中的多边形保存到MS SQL中。问题是,我第一次这样做,它工作,第二次它给我错误:

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 3 ("@2"): The supplied value is not a valid instance of data type geography. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.

我正在使用EntityFramework 6.1.3,代码优先。错误出现在下面的提交行中:

var newPoly = new GenericPolygon()
                {
                    Name = webShape.Name,
                    PolyShape = shapePolygon,
                    IsEnabled = true,
                    IsDeleted = false
                };
                _unitOfWork.PolygonRepository.Add(newPoly);
                _unitOfWork.Commit();

SQL表结构与该类相同,只是它具有int ID标识列,名称为varchar(255)。 PolyShape列属于地理类型。

shapePolygon变量的定义如下,类添加了一个名为“LongLat”的只读属性,用于从Google LatLong切换到MS LongLat格式:

var shapePolygon = DbGeography.PolygonFromText("POLYGON((" + webShape.LongLat + "))", 4326);

提交行本身调用db context save方法(我使用UoW模式来减少代码):

this.context.SaveChanges();

我不能为我的生活弄清楚为什么它会工作一次,然后不再重复,除非我重新启动我的VS(在服务器上运行带有IIS Express的SQL 2013 - SQL 2008 R2 Enterprise)。

任何帮助或指示将不胜感激: - )

2 个答案:

答案 0 :(得分:0)

我似乎已经缩小了这个问题的范围,虽然这可能是一个解决方法,而不是一个答案,这可能会帮助其他人。

问题是SQL Server的版本,即SQL 2008 R2 10.50.4000。我将我的数据库迁移到SQL Server 2012 build 11.0.5058,之后每次都运行代码。

希望这有助于某人!

答案 1 :(得分:0)

我刚遇到这个问题,并通过反转多边形中的点来解决它。显然,SQL Server拥有这些东西。

因此,而不是像strGeog + = string.Format(“ {0} {1},”,latlong [0],latlong [1])这样的字符串连接;我将其更改为:

foreach (XmlNode xnPoly in xmlPolyList)
{
    strGeog = "";
    firstlatlong = null;

    if (xnPoly["coordinates"] != null)
    {
        latlongpairs = xnPoly["coordinates"].InnerText.Replace("\n", "").Split(' ');

        foreach (string ll in latlongpairs)
        {
            latlong = ll.Split(',');

            if (firstlatlong == null) firstlatlong = latlong;

            strGeog = string.Format("{0} {1}, ", latlong[0], latlong[1]) + strGeog;
        }
    }
    if (strGMPoly.Length > 0)
    {
        strGeog = strGeog.Substring(0, strGeog.Length - 2); //trim off the last comma and space
        strGeog = "POLYGON((" + string.Format("{0} {1} ", firstlatlong[0], firstlatlong[1]) + strGeog + "))"; // conversion from WKT needs it to come back to the first point.
    }
    i++;

    dbPCPoly = new PostCodePolygon();
    dbPCPoly.geog = DbGeography.PolygonFromText(strGeog, 4326);

    LocDB.PostCodePolygons.Add(dbPCPoly);
    LocDB.SaveChanges();
    Console.WriteLine(string.Format("Added Polygon {0} for Postcode ({1})", dbPCPoly.PCPolyID, dbPC.PostCodeName));
}