2012-08-06 3 views
0

내 SQL 서버 2012 DB에서 지리 데이터를 검색하기 위해 노력하고있어 함께 :하나는 잘못된 형식이었다 - Microsoft.SqlServer.Type

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

데이터가 SQL Server 2008의 경우 지형 유형이 Polygon 인 경우 모두 잘 작동합니다. 유형이 새로운 CurvePolygon입니다 때 다음 코드 줄은 오류로 충돌 : 내가 읽고SQL CLR 데이터 형식이라는 섹션에서이 MSDN article에서

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) 

당신은 SQLTYPE으로 어셈블리 버전을 참조 할 때 11.0 및 버전 10.0도 설치되어 있으면 유사한 오류가 발생할 수 있습니다. 그래서 설명대로 Config 파일을 변경했습니다. 그러나 그것은 내 문제를 해결하지 못했습니다.

대단히 감사하게 생각합니다!

답변

1

나는 동일한 문제가있었습니다. SQL-Server 2012에서는 제대로 작동했지만 SQL-Server 2008에서는 작동하지 않았습니다. 내 Geography 데이터를 사용하고 SqlDataReader.GetSqlBytes을 사용하여 데이터를 역 직렬화해야했습니다.

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

+0

답변을 주셔서 감사합니다! 불행하게도 충돌은 'DataReader'를 얻거나 내 DataTable을 채우기 전에 발생합니다. 'Fill' 중에 충돌이 발생했습니다 – Johann

+0

어댑터가 아닌 일반 바닐라 리더를 사용해 보았습니까? – Daniel

0

당신이 SQLGEOGRAPHY 객체가 DB에 텍스트로 SQLTYPE 변환 시도가 필요하지 않은 경우.

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

이제 데이터는 다음 형식으로 전달되어야합니다.

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

또는 두 유형이 성공적으로의 DataTable에 열을 채울 텍스트로 표현 될 수있는 것처럼

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

.

2

다음과 같은 바인딩 리디렉션을 시도 할 수 있습니다 :로드 어셈블리에 문제가있는 것처럼

<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