我有实体"点",包含Id,文本和地理坐标.
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
Run Code Online (Sandbox Code Playgroud)
这是表的sql代码和插入的存储过程.我有使用短小精悍的课程:
public class DapperRequester : IDisposable {
private readonly SqlConnection _connection;
private SqlTransaction _transaction;
public DapperRequester(string connectionString) {
_connection = new SqlConnection(connectionString);
_connection.Open();
} …Run Code Online (Sandbox Code Playgroud) 我有一个基本上必须做这样的查询的系统:
SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)
Run Code Online (Sandbox Code Playgroud)
使用vanilla SQL参数时这很简单,你只需要以非典型的方式创建参数(其中builder变量是我用来创建矩形的SqlGeometryBuilder):
command.Parameters.Add(new SqlParameter
{
UdtTypeName = "geometry",
Value = builder.ConstructedGeometry,
ParameterName = "@paremeter"
});
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用dapper这样做时,我得到一个错误,它无法弄清楚如何将其用作参数.任何有这个工作的人,或者有关如何启用此功能的任何指示?我有一个解决方法,但这涉及使用字符串表示并将其转换为我的SQL查询中的几何类型.我真的不想那样.
要回答评论,我得到的错误是'Microsoft.SqlServer.Types.SqlGeometry类型的成员参数不能用作参数值'.换句话说,dapper不知道如何将SqlGeometry对象作为参数处理.