我试图通过以下方式从我的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 article中,在名为 SQL CLR数据类型的部分中,我已经读过,当您引用SqlTypes程序集版本11.0并且还安装了版本10.0时,您可能会看到类似的错误。所以我按照解释更改了我的Config文件。但它还没有解决我的问题。
任何想法都非常感谢!
答案 0 :(得分:3)
您可以尝试以下绑定重定向:
<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>
看起来装载组件存在问题。更多信息:http://blog.devart.com/adventures-of-clr-types-in-net-framework.html
答案 1 :(得分:1)
我有同样的问题。它在SQL-Server 2012中运行良好,但在SQL-Server 2008中运行不正常。我不得不使用Geography
数据,使用SqlDataReader.GetSqlBytes
然后反序列化。
var geo = SqlGeography.Deserialize(dr.GetSqlBytes(0))
答案 2 :(得分:0)
如果您不需要SQLGEOGRAPHY对象,请尝试将SQLType转换为DB中的Text。
new SqlDataAdapter("SELECT SpatialColumn.STAsText() FROM [SpatialTable]", myConnection).Fill(myDatatable);
现在您的数据应以格式显示;
"POLYGON((-123.22,102.32...."
或
"CURVEPOLYGON((-123.22,102.32...."
任何一种类型都可以表示为Text,它将成功填充DataTable中的列。