使用没有字母参数的 Postgresql 的 Dapper 存储过程
Posted
技术标签:
【中文标题】使用没有字母参数的 Postgresql 的 Dapper 存储过程【英文标题】:Dapper stored procedures with Postgresql without alphabetical parameters 【发布时间】:2012-07-31 17:25:49 【问题描述】:我正在尝试使用 C# 和 Dapper 调用用 plpgsql 编写的 Postgresql 存储过程,但我发现 Dapper 在将参数插入存储过程之前会按字母顺序排列参数。有没有办法可以避免这种行为并以正确的顺序插入项目?
例如,以下调用将无法正确运行,因为它会按字母顺序排列参数名称。我必须手动将它们按字母顺序排列才能通过呼叫。
int map_id = conn.Query<int>(
"insert_color",
new
zebra_name = new DbString Value = slide_name ,
door_name = new DbString Value = fov_name ,
foo_number = cycle_number,
variable_path = new DbString Value = image_path ,
random_path = new DbString Value = meta_path ,
x = x,
y = y,
z = z,
exposure = exposure,
type_name = new DbString Value = image_type ,
copy = copy
,
commandType: CommandType.StoredProcedure).First();
这里是存储过程声明:
CREATE OR REPLACE FUNCTION insert_color(
zebra_name text, door_name text, foo_number integer,
variable_path text, random_path text,
x real, y real, z real, exposure real,
type_nametext, copy integer) RETURNS integer AS $$
...
$$ LANGUAGE plpgsql;
【问题讨论】:
“字母化”是什么意思? 这意味着不是按顺序将参数发送到函数(首先是斑马名称,然后是 door_name 等),而是按字母顺序发送参数(首先是 copy,door_name,exposure... 等)。我必须在参数名称前添加“a_”、“b_”、“c_”才能使函数正确运行。 好吧,在这种情况下,无论“精致”是什么,它都坏了。任何损坏的东西我都会停止使用,但您可以尝试报告错误。当然,如果它不能调用函数,那么它可能无法处理数组、记录类型、tsearch、postgis、... Dapper 是由 @SO 的人写的... 老实说,它并没有对我造成太大影响,因为我可以手动按字母顺序排列,这很烦人。 【参考方案1】:在内部,Dapper 使用反射来获取 param 对象的属性。具体来说,GetProperies(...)
的麻烦在于,不能保证它们按特定顺序排列...
GetProperties 方法不按特定顺序返回属性,例如字母顺序或声明顺序。您的代码不得依赖于返回属性的顺序,因为该顺序会有所不同。
为了有点有用,他们选择按字母顺序对参数进行排序,但不幸的是,无法确保参数按照您在类中的顺序出现。
【讨论】:
这不是 PostgreSQL 中命名参数的语法,这是问题的具体内容。我不确定你如何强制 Dapper 使用命名参数约定,但这里描述了 PostgreSQL 端的语法:postgresql.org/docs/9.1/interactive/… @kgrittn,你是对的。我在 google 上快速搜索了 postgresql 语法,并找到了调用存储过程的页面,我猜它毕竟不是 postgresql。我已经删除了代码位。以上是关于使用没有字母参数的 Postgresql 的 Dapper 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
使用非大写字母的 Laravel/PostgreSQL 查询