我知道在Postgres pure中,可以将整数数组传递到函数中,但在.NET数据提供程序Npgsql.

我目前有一个DbCommand,在其中加载对存储过程的调用,添加一个参数并执行scalar,以获取一个Id来填充对象.

现在需要将n个整数作为参数.这些用于创建子记录,通过id将新创建的记录链接到整数参数.

理想情况下,我不希望对每个整数的DbCommand进行多个ExecuteOnQuery调用,因此我将构建一个csv字符串作为参数,该参数将在数据库端拆分.

我通常生活在Linq2SQL中,享受数据库抽象,在这个项目中使用手动数据访问.这一切只是变得有点脏,人们通常如何将这些参数传递到postgres中?

推荐答案

见:http://www.postgresql.org/docs/9.1/static/arrays.html

如果您的非本机驱动程序仍然不允许您传递数组,那么您可以:

  • 传递数组的字符串表示形式(然后存储过程可以将其解析为数组——请参见string_to_array)

    CREATE FUNCTION my_method(TEXT) RETURNS VOID AS $$ 
    DECLARE
           ids INT[];
    BEGIN
           ids = string_to_array($1,',');
           ...
    END $$ LANGUAGE plpgsql;
    

    然后

    SELECT my_method(:1)
    

    带:1='1,2,3,4'

  • 依靠Postgres本身将字符串转换为数组

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
           ...
    END $$ LANGUAGE plpgsql;
    

    然后

    SELECT my_method('{1,2,3,4}')
    
  • Select 不使用绑定变量,而是发出一个包含所有参数的显式命令字符串(确保验证或转义来自外部的所有参数,以避免SQL注入攻击)

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
           ...
    END $$ LANGUAGE plpgsql;
    

    然后

    SELECT my_method(ARRAY [1,2,3,4])
    

Postgresql相关问答推荐

如何在gorm中创建一个可读但不可写的字段

PostgreSQL中btree_gist索引涉及integer和tstzrange属性查询计划的问题

Org.postgresql.util.PSQLException:错误:函数LOWER(BYTEA)不存在

DBT-DBT依赖于未找到的源

在PostgreSQL中是否有与SQLite R*Tree类似功能?

在Ubuntu 18.04 Bionic上安装PostgreSQL(已删除回购)

在Postgres中,如何删除包含N个自然数的表,并替换为生成子查询?

无法将 json 范围读取为 pgtype.Int4range

在Power BI和Excel中将日期格式化为正确格式

具有有限字母表的自定义字符串类型

无法从外部连接到在 AWS EC2 实例上运行的 Postgres

使用 postgresql Select 整数作为位和状态表

消除 PostgreSQL SELECT 语句中的重复行

PostgreSQL 输入结束时的语法错误

PostgreSQL INSERT 插入一个枚举数组

我不明白 postgresql 的 nextval() 是如何工作的,有人可以解释一下吗?

无法使用 sequelize 从本地 node 应用程序连接到 heroku postgresql 数据库

SQL:多次重复结果行,并对行进行编号

PostgreSQL 嵌套 CTE 和 UNION

如何将 PostgreSQL 查询输出导出到 csv 文件