SQL Spatial Types와 함께 Dapper를 매개 변수로 사용

dapper orm spatial sql-server-2008

문제

기본적으로 다음과 같은 쿼리를 수행해야하는 시스템이 있습니다.

command.Parameters.Add(new SqlParameter
{
    UdtTypeName = "geometry",
    Value = builder.ConstructedGeometry,
    ParameterName = "@paremeter"
});

이것은 바닐라 SQL 매개 변수를 사용할 때 매우 간단합니다. 일반적이지 않은 방식으로 매개 변수를 만들어야합니다 (빌더 변수는 사각형을 만드는 데 사용하는 SqlGeometryBuilder입니다).

command.Parameters.Add(new SqlParameter
{
    UdtTypeName = "geometry",
    Value = builder.ConstructedGeometry,
    ParameterName = "@paremeter"
});

자, 내가 dapper를 사용하여이 작업을 시도 할 때, 이것을 매개 변수로 사용하는 방법을 알 수 없다는 오류가 발생합니다. 이 작업을 수행 한 사람이나이 기능을 활성화하는 방법에 대한 지침이 있습니까? 해결 방법이 있지만 문자열 표현을 사용하여 SQL 쿼리의 도형 유형으로 변환해야합니다. 나는 정말로 그것을 원하지 않는다.

주석에 대답하기 위해 내가 얻는 오류는 'Microsoft.SqlServer.Types.SqlGeometry 형식의 멤버 매개 변수를 매개 변수 값으로 사용할 수 없습니다.'입니다. 즉, dapper는 SqlGeometry 객체를 매개 변수로 처리하는 방법을 알지 못합니다.

수락 된 답변

이상하고 멋진 DB 특정 매개 변수를 구현하는 열쇠는 모두 SqlMapper.IDynamicParameters

이 간단한 인터페이스에는 단일 끝점이 있습니다.

public class SpatialParam : SqlMapper.IDynamicParameters
{
    string name; 
    object val;

    public SpatialParam(string name, object val)
    {
       this.name = name; 
       this.val = val;
    }

    public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
    {
       var sqlCommand = (SqlCommand)command;
       sqlCommand.Parameters.Add(new SqlParameter
       {
          UdtTypeName = "geometry",
          Value = val,
          ParameterName = name
       });
    }
}

Dapper에는 이미이 인터페이스의 DB 일반 구현이 있습니다. DynamicParameters 를 사용하면 출력 및 반환 값을 처리 할 수 ​​있습니다.

이 공간적인 것들을 모방하기 위해 나는 다음과 같은 것을 시도 할 것이다 :

public class SpatialParam : SqlMapper.IDynamicParameters
{
    string name; 
    object val;

    public SpatialParam(string name, object val)
    {
       this.name = name; 
       this.val = val;
    }

    public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
    {
       var sqlCommand = (SqlCommand)command;
       sqlCommand.Parameters.Add(new SqlParameter
       {
          UdtTypeName = "geometry",
          Value = val,
          ParameterName = name
       });
    }
}

용법:

public class SpatialParam : SqlMapper.IDynamicParameters
{
    string name; 
    object val;

    public SpatialParam(string name, object val)
    {
       this.name = name; 
       this.val = val;
    }

    public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
    {
       var sqlCommand = (SqlCommand)command;
       sqlCommand.Parameters.Add(new SqlParameter
       {
          UdtTypeName = "geometry",
          Value = val,
          ParameterName = name
       });
    }
}

이 간단한 인터페이스 구현은 단일 매개 변수 만 처리하지만 생성자에서 전달하거나 도우미 AddParameter 메서드를 추가하여 여러 매개 변수를 처리하도록 쉽게 확장 할 수 있습니다.


전문가 답변

  • Dapper.EntityFramework 1.26은 DbGeography를 지원합니다 DbGeography
  • Dapper 1.32에는 SqlGeography 대한 내장 된 지원 기능이 SqlGeography
  • Dapper 1.33에는 SqlGeometry 대한 inbuilt 지원이 SqlGeometry
  • Dapper.EntityFramework 1.33에는 DbGeometry에 대한 내장 된 지원 기능이 DbGeometry
  • Dapper 1.34에는 SqlHierarchyId 대한 inbuilt 지원이 SqlHierarchyId

그래서 최신 라이브러리; 그것은 단순히 작동해야합니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.