SQL DBGeography第二次插入失败
本文关键字:失败 插入 第二次 DBGeography SQL | 更新日期: 2023-09-27 17:51:26
这个很奇怪。我试图保存一个多边形从谷歌地图到MS SQL,通过MVC控制器。问题是,我第一次这样做,它工作,第二次它给我错误:
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上下文保存方法(我使用UoW模式来减少代码):
this.context.SaveChanges();
我不能为我的生活弄清楚为什么它工作一次,然后不再,除非我重新启动我的VS(运行VS 2013与IIS Express - SQL 2008 R2企业在服务器上)。
任何帮助或指针将不胜感激:-)
我似乎已经缩小了这个问题的范围,虽然它更多的是一个变通而不是一个答案,但这可能会帮助别人。
问题是SQL Server的版本号,即SQL 2008 R2 10.50.4000。我将我的数据库迁移到SQL Server 2012构建11.0.5058,之后代码工作,每次。
希望这能帮助到一些人!
我刚刚解决了这个问题,并通过反转多边形中的点来解决它。显然,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));
}