1

我正在尝试从我的 SQl Server 2012 数据库中检索地理数据:

new SqlDataAdapter("SELECT [SpatialColumn] FROM [SpatialTable]", myConnection).Fill(myDatatable);

当数据是诸如 Sql Server 2008 地理类型时Polygon,一切正常。但是当类型是新的时CurvePolygon,那行代码会因错误而崩溃:

System.FormatException occurred
Message="One of the identified items was in an invalid format."
Source="Microsoft.SqlServer.Types"
StackTrace: at Microsoft.SqlServer.Types.GeoData.Read(BinaryReader r)

在这篇MSDN 文章中,在名为SQL CLR Data Types的部分中,我读到当您引用 SqlTypes 程序集版本 11.0,并且还安装了 10.0 版本时,您可能会看到类似的错误。所以我按照说明更改了我的配置文件。但这并没有解决我的问题。

任何想法都非常感谢!

4

3 回答 3

4

您可以尝试以下绑定重定向:

 <assemblyBinding>   
      <!--....-->
     <dependentAssembly>
            <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" />
            <bindingRedirect oldVersion="10.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>

加载程序集似乎有问题。更多信息:https ://blog.devart.com/adventures-of-clr-types-in-net-framework.html

于 2016-12-30T11:45:21.590 回答
1

我遇到过同样的问题。它在 SQL-Server 2012 中运行良好,但在 SQL-Server 2008 中却不行。我必须使用我的Geography数据,使用SqlDataReader.GetSqlBytes然后反序列化。

var geo = SqlGeography.Deserialize(dr.GetSqlBytes(0))

于 2012-11-21T12:51:26.990 回答
0

如果您不需要 SQLGEOGRAPHY 对象,请尝试将 SQLType 转换为数据库中的文本。

new SqlDataAdapter("SELECT SpatialColumn.STAsText() FROM [SpatialTable]", myConnection).Fill(myDatatable);

现在您的数据应该以格式通过;

"POLYGON((-123.22,102.32...."

或者

"CURVEPOLYGON((-123.22,102.32...."

因为任一类型都可以表示为文本,这将成功填充 DataTable 中的列。

于 2014-03-20T19:36:10.670 回答