gpt4 book ai didi

sql-server-2008 - 将 Dapper 与 SQL 空间类型用作参数

转载 作者:行者123 更新时间:2023-12-04 05:26:12 24 4
gpt4 key购买 nike

我有一个系统,它基本上必须执行这样的查询:

SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)

这在使用普通 SQL 参数时非常简单,您只需以非典型方式创建参数(其中 builder 变量是我用来创建矩形的 SqlGeometryBuilder):
command.Parameters.Add(new SqlParameter
{
UdtTypeName = "geometry",
Value = builder.ConstructedGeometry,
ParameterName = "@paremeter"
});

现在,当我尝试使用 dapper 执行此操作时,我收到一个错误,它无法弄清楚如何将其用作参数。任何有此工作的人,或有关如何启用此功能的任何指示?我确实有一个解决方法,但这涉及使用字符串表示并将其转换为我的 SQL 查询中的几何类型。我真的不想那样。

要回答评论,我得到的错误是“Microsoft.SqlServer.Types.SqlGeometry 类型的成员参数不能用作参数值”。换句话说,dapper 不知道如何处理一个 SqlGeometry 对象作为参数。

最佳答案

实现奇怪而美妙的 DB 特定参数的关键都归结为 SqlMapper.IDynamicParameters
这个简单的接口(interface)有一个端点:

public interface IDynamicParameters
{
void AddParameters(IDbCommand command);
}

Dapper 已经有了这个接口(interface)的 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
});
}
}

用法:
cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
new SpatialParam("@parameter", builder.ConstructedGeometry));

这个简单的接口(interface)实现只处理一个参数,但它可以很容易地扩展为处理多个参数,方法是从构造函数传入或添加一个辅助 AddParameter 方法。

关于sql-server-2008 - 将 Dapper 与 SQL 空间类型用作参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6690565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com