其中一个标识的项目格式无效 - Microsoft.SqlServer.Type

时间:2012-08-06 15:08:33

标签: c# sql-server sql-server-2012 geography sqlgeography

我试图通过以下方式从我的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文件。但它还没有解决我的问题。

任何想法都非常感谢!

3 个答案:

答案 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中的列。