ID, 텍스트 및 지리 좌표가 포함 된 엔티티 "포인트"가 있습니다.Dapper로 SqlGeography 매핑
CREATE TABLE [Point] (
[Id] INT IDENTITY CONSTRAINT [PK_Point_Id] PRIMARY KEY,
[Coords] GEOGRAPHY NOT NULL,
[Text] NVARCHAR(32) NOT NULL,
[CreationDate] DATETIME NOT NULL,
[IsDeleted] BIT NOT NULL DEFAULT(0)
)
CREATE PROCEDURE [InsertPoint]
@text NVARCHAR(MAX),
@coords GEOGRAPHY
AS BEGIN
INSERT INTO [Point](Text, Coords, CreationDate)
VALUES(@text, @coords, GETUTCDATE())
SELECT * FROM [Point] WHERE [Id] = SCOPE_IDENTITY()
END
이것은 테이블의 SQL 코드를 삽입하는 프로 시저의 TS. 내가 날씬한 사용하는 클래스가 :
public class DapperRequester : IDisposable {
private readonly SqlConnection _connection;
private SqlTransaction _transaction;
public DapperRequester(string connectionString) {
_connection = new SqlConnection(connectionString);
_connection.Open();
}
public void Dispose() {
_connection.Close();
}
public void BeginTransaction() {
_transaction = _connection.BeginTransaction();
}
public void CommitTransaction() {
_transaction.Commit();
}
public void RollbackTransaction() {
_transaction.Rollback();
}
public void Query(string query, object parameters = null) {
Dapper.SqlMapper.Execute(_connection, query, parameters, transaction: _transaction);
}
public void QueryProc(string procName, object parameters = null) {
Dapper.SqlMapper.Execute(_connection, procName, parameters, commandType: CommandType.StoredProcedure, transaction: _transaction);
}
public IEnumerable<T> Execute<T>(string query, object parameters = null) {
return Dapper.SqlMapper.Query<T>(_connection, query, parameters, transaction: _transaction);
}
public IEnumerable<dynamic> ExecuteProc(string procName, object parameters = null) {
return Dapper.SqlMapper.Query(_connection, procName, parameters,
commandType: CommandType.StoredProcedure, transaction: _transaction);
}
public IEnumerable<T> ExecuteProc<T>(string procName, object parameters = null) {
return Dapper.SqlMapper.Query<T>(_connection, procName, parameters,
commandType: CommandType.StoredProcedure, transaction: _transaction);
}
}
C#을 -class 것은 :
public class Point
{
public int Id { get; set; }
public SqlGeography Coords { get; set; }
public string Text { get; set; }
}
그리고 다른 클래스와 같은 시스템을 사용하는 경우 저장소 방법
public Point InsertPoint(string text, SqlGeography coords)
{
using (var requester = GetRequester())
{
return requester.ExecuteProc<Point>("InsertPoint", new { text, coords }).FirstOrDefault();
}
}
을 가지고, 모든 것이 좋아요입니다 ,하지만 매핑에 문제가있다, 나는 SqlGeography 타입 때문이라고 생각한다. 사용 :
SqlGeography coords = new SqlGeography();
coords = SqlGeography.Point(10.5, 15.5, 4326);
Point point = new Point { Coords = coords, Text = "Text" };
point = Repositories.PointRepository.InsertPoint(point.Text, point.Coords);
그리고 예외가 있습니다 The member coords of type Microsoft.SqlServer.Types.SqlGeography cannot be used as a parameter value
그 유형을 매핑하는 비법이 있습니까?
QueryMultiple에서도 사용할 수 있습니까? reader.Read를 할 때 "Error parsing column 5"가 표시됩니다. 열 5는 SqlGeography 다각형입니다. –
사용중인 ms 데이터베이스 버전에 따라 올바른 버전의 SqlGeography를 사용하십시오. Sql 2012에 SqlGeography 버전 10.5를 설치해야했습니다. 그런 다음 Dapper와 잘 작동했습니다. – mac10688