9

我有 WCF REST 服务,其中包含以下代码

var geo = DbGeography.PointFromText(string.Format("POINT({0} {1})", longitude, latitude), DbGeography.DefaultCoordinateSystemId);

单元测试工作正常,但是当我从客户端或 HTTP 调试器调用此代码提供任何纬度和经度值除零时,它会失败并出现异常:

"24141: A number is expected at position X of the input. The input has ,XXXXXX."
   at Microsoft.SqlServer.Types.WellKnownTextReader.RecognizeDouble()
   at Microsoft.SqlServer.Types.WellKnownTextReader.ParsePointText(Boolean parseParentheses)
   at Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type)
   at Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType type, SqlChars taggedText, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeography.STPointFromText(SqlChars pointTaggedText, Int32 srid)

纬度和经度例如
lat:37.58336895 long:-122.40549454
lat:37.38931302 long:-122.16207476

我使用从 SQLServer 安装目录和 SqlGeography.Point 引用的 Microsoft.SqlServer.Types 来处理代码端的部分数据。现在我想直接使用 EF 5 功能而不使用对 Microsoft.SqlServer.Types 的引用。无论有没有这个参考,它都会失败。

知道有什么问题吗?

已安装 .NET 4.5,SQL Server 版本为 Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (Intel X86) Sep 22 2011 00:28:06 版权所有 (c) 1988-2008 Microsoft Corporation Standard Edition on Windows NT 6.1(Build 7601 : 服务包 1)

4

1 回答 1

13

您必须在连接之前使用 invariantCulture 转换坐标。

  String lon = longitude.ToString(CultureInfo.InvariantCulture);
  String lat = latitude.ToString(CultureInfo.InvariantCulture);
  var geo = DbGeography.PointFromText(string.Format("POINT({0} {1})", lon, lat), DbGeography.DefaultCoordinateSystemId);
于 2014-10-21T16:27:11.013 回答