Azure에서 'Microsoft.SqlServer.Types'버전 10 이상을 찾을 수 없습니다.


98

ASP.NET MVC 4에서 webapi를 만들려고합니다. webapi는 Entity Framework 5 Spatial 유형을 사용했으며 매우 간단한 코드를 작성했습니다.

  public List<Area> GetAllAreas()
    {
        List<Area> aList = db.Areas.ToList();
        return aList;
    }

영역에는 DbGeometry가 포함됩니다.

이 로컬을 실행하면 작동하지만 azure에 게시하면 다음 오류가 발생합니다.

어셈블리 'Microsoft.SqlServer.Types'버전 10 이상을 찾을 수 없기 때문에이 공급자에 대해 공간 형식 및 함수를 사용할 수 없습니다.

누구든지 이것을 해결하는 방법을 알고 있습니까? :)

감사!


2
Azure 웹 사이트 또는 클라우드 서비스에서 웹 역할을 사용하고 있습니까? 또한 데이터베이스가 SQL Azure 데이터베이스입니까? SQL Azure 데이터베이스에 대해 로컬 코드를 실행 해 보았고 작동합니까?
Joe Capka

답변:


131

해결책을 찾았습니다! Nuget 패키지 Microsoft.SqlServer.Types를 설치하십시오.

PM> 설치 패키지 Microsoft.SqlServer.Types

추가 정보 링크


4
감사. 이것은 내가 오전 2시에 출판 한 후에 방금 일어났습니다.
Lee Smith

3
그 너겟 패키지를 올려서 다행입니다! 그것은 항상 나를 얻습니다.
Pure.Krome 2013 년

OMG! DbGeography를 사용하기 위해 웹 앱에 거의 2MB의 이진 데이터를 추가합니다.
Yovav

13
@Yovav, 적어도 플로피 디스크에서 실행 중입니다. 2MB의 바이너리 데이터가 응용 프로그램의 성능에 영향을 미치지 않는다고 생각합니다. 벤치 마크를 실행하고 CPU에 미치는 영향을 (실제 데이터로) 알려 주시기 바랍니다.
Diomedes Domínguez

3
문제를 해결하기에 충분하지 않았고 Chris의 대답 도해야했습니다.
Shimmy Weitzhandler

114

위 의 대답 은 어셈블리 버전 11 (SQL Server 2012)을 사용할 수있을 때 제대로 작동합니다.

내 솔루션에는 동일한 어셈블리의 버전 13 (SQL Server 2016)에 대한 다른 종속성이 있기 때문에이 문제가 발생했습니다. 이 경우 Entity Framework (최소 v6.1.3)는 어셈블리의 버전 10과 11 만 찾도록 SqlTypesAssemblyLoader (이 예외의 소스 )에 하드 코딩되어 있습니다.

이 문제를 해결하기 위해 다음과 같이 사용할 어셈블리를 Entity Framework에 알릴 수 있습니다.

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;

2
그레이트 스팟-SQL 2014 CLR 유형 만 설치된 시스템에도 적용됩니다. 우리의 경우, 방금 SQL 2012 CLR 유형을 설치하고 문제를 해결했습니다. 그러나 상위 버전의 어셈블리에 대한 특정 종속성이있는 경우 이것이 최상의 솔루션 인 것으로 보입니다.
Andras Zoltan

1
정적 공용 속성입니다. 애플리케이션 시작시 설정해야합니다. 예를 들어 웹 응용 프로그램의 Global.asax.cs에있는 Application_Start 이벤트에서 설정하고 있습니다.
Chris

3
+1 이것은 나를 위해 일한 유일한 것입니다. 나는 그것을 내 커스텀 EntityContext클래스 의 생성자에 넣었다 DbContext.
Chris

2
내 베이컨을 구했습니다!
Matt Cashatt 17.03.22

23
어셈블리 이름을 하드 코딩하지 않으려면 사용할 수 있습니다.SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack

68

어떤 이유로이 문제를 해결 한 바인딩 리디렉션이 누락되었습니다.

다음을 추가하면 내 문제가 해결되었습니다.

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

2
컴퓨터에있는 Microsoft.SqlServer.Types의 버전 번호를 확인하려면 AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }_logger가 Nlog 로거 인 위치 를 사용할 수 있습니다 .
Daniël Tulp 2017-08-31

1
이것은 내 문제를 해결했습니다 (내 경우에는 유형이 이미 설치되어 있기 때문에). SQL Server 유형을 설치 한 후에도 오류가 계속 발생하면이 답변을 확인하십시오.
캔 Poyrazoğlu

1
@ R2D2 감사합니다. 이것은 나에게도 해결되었습니다.
Ogglas

1
SQLServerTypes를 설치했지만 여전히 문제가 발생했습니다. 이것을 web.config에 추가하면 문제가 해결되었습니다.
saurabhj

25

이 문제를 해결하는 방법에는 두 가지가 있습니다.

  1. 서버 액세스 권한이있는 경우 https://www.microsoft.com/en-us/download/details.aspx?id=29065 에서 "Microsoft System CLR Types for SQL Server 2012"를 설치 하거나 직접 링크 아래에 직접 링크 사용 X86에 연결 : http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 또는 X64에 직접 연결 : http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. 두 번째 방법은 NuGet 패키지 관리자를 사용하고 설치하는 것입니다.

    설치 패키지 Microsoft.SqlServer.Types

그런 다음 아래와 같이 플러그인 참고 사항을 따르십시오.

공간 데이터 형식을 사용하는 응용 프로그램을 'SQL Server 용 시스템 CLR 형식'이 설치되지 않은 컴퓨터에 배포하려면 네이티브 어셈블리 SqlServerSpatial110.dll도 배포해야합니다. 이 어셈블리의 x86 (32 비트) 및 x64 (64 비트) 버전이 모두 SqlServerTypes \ x86 및 SqlServerTypes \ x64 하위 디렉터리 아래의 프로젝트에 추가되었습니다. 네이티브 어셈블리 msvcr100.dll은 C ++ 런타임이 설치되지 않은 경우에도 포함됩니다.

런타임시 이러한 어셈블리 중 올바른 어셈블리를로드하려면 코드를 추가해야합니다 (현재 아키텍처에 따라 다름).

ASP.NET 응용 프로그램 ASP.NET 응용 프로그램의 경우 Global.asax.cs의 Application_Start 메서드에 다음 코드 줄을 추가합니다.

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

데스크톱 애플리케이션 데스크톱 애플리케이션의 경우 공간 작업을 수행하기 전에 실행할 다음 코드 줄을 추가합니다.

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

2
SQL Server 또는 NuGet을 설치해도 문제가 해결되지 않았습니다. 간단한 CLR 유형으로 문제가 해결되었습니다. 이것이 허용되는 솔루션이어야합니다.
Can Poyrazoğlu

1
Link to X64는 Microsoft SQL Server 2016 (SP1) (KB3182545)-13.0.4001.0 (X64) 2016 년 10 월 28 일 18:17:30 저작권 (c) Windows 10 Enterprise의 Microsoft Corporation Express Edition (64 비트)에서 작동합니다. 6.3 <X64> (빌드 10586 :)
zapoo

나는 ASP.NET 스타일의 로더를 사용하는 데 필요한하지만 내 개발 경로였다 ~/대신 ~/bin. 경로도 확인하십시오.
jocull

원하는 SQL 버전에 대한 SQL 서버 팩을 설치할 수 있었지만 각 SQL 서버 버전마다 모두 다르기 때문에 바인딩 리디렉션이 설치된 버전을 가리 키도록해야했습니다.
Chris Rice는

13

이 문제도 발생했지만 Microsoft.SqlServer.Types 너겟 패키지가 이미 설치되어 있습니다.

나를 위해 문제를 해결 한 것은 Solution> References> System.Data.Entity> Properties> Copy Local로 이동하여 True로 설정하는 것이 었습니다.

참고 : Microsoft.SqlServer.Types에 대한 로컬 복사는 이미 true로 설정되었으며 System.Data.Entity에 문제가 있었지만 오류 메시지는 여전히 Microsoft.SqlServer.Types에 대한 것입니다.

솔루션은 Windows Azure 포럼에서 제공 합니다.


1
이 옵션은 너겟 패키지에서 사용할 수 없습니다.
Shimmy Weitzhandler

언급했듯이 너겟의 옵션이 아닌 참조의 속성 옵션에 있기 때문입니다. :) 해결 방법에 감사드립니다! 나를 위해 일한
Emixam23

9

Web.config 파일에 "dependentAssembly"를 추가하십시오.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

이것은 나를 위해 일했습니다.


5

나를위한 해결책은 다음 코드를 Global.asax.cs에 추가하는 것입니다 Application_Start().

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

형제들에게 행운을 빕니다.


3

현재 게시물에 대한 답변에 대한 의견 에 따라 다음 두 줄을 추가하여 (주 기능이 선호 됨) 콘솔 앱에 대한 내 문제를 해결했습니다.

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

3

내 경우 (웹폼 앱)에서 나는에 다음 행을 추가 문제를 해결 Application_StartGlobal.asax파일.

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
System.Data.Entity.SqlServer.SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

누군가에게 도움이되기를 바랍니다.


1
이것은 VS 2019 환경, 최신 수정에서 작동했습니다. 공유해 주셔서 감사합니다
coder kemp

1

위의 솔루션 중 어느 것도 저에게 효과가 없었습니다.

  • SQL Server 기능 팩이 설치되어 있습니까? 예
  • NuGet 패키지가 설치 되었습니까? 예
  • DLL이 GAC 및 프로젝트 저장소에 있습니까? 예

이 오류는 서버의 리소스 부족 으로 인해 발생할 수도 있습니다 . SQL 서버를 다시 시작했는데 자동으로 해결되었습니다.


0

같은 문제가있었습니다. 나는 공간 명령을 사용하는 SQL 함수를 사용 EF6하고 호출 SQL하고 있습니다. 나는 이것을 단위 테스트를 통해 테스트했고 잘 작동했습니다. Asp.Net솔루션 을 연결하려고 할 때 오류가 발생했습니다.

어셈블리 'Microsoft.SqlServer.Types'버전 10 이상을 찾을 수 없기 때문에이 공급자에 대해 공간 형식 및 함수를 사용할 수 없습니다.

첨가 용으로 NUGET패키지 "Microsoft.SqlServer.Types"를하고 추가 SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));받는 사람 Application_Start methodGlobal.asax.cs모든 벌금을했다.


0

제 경우에는 잘못 구성된 연결 문자열이 원인이었습니다. 연결 문자열이 올바르게 구성되었는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.