使用没有字母参数的 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 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

在PostgreSQL中实现按拼音汉字拼音首字母搜索的例子

有没有办法在熊猫数据框中运行 postgresql 查询?

使用非大写字母的 Laravel/PostgreSQL 查询

带有可选参数的 Postgresql 函数

org.postgresql.util.PSQLException:没有为参数 1 指定值。- Postgres

非字母数字的 PostgreSQL 查询