我想要澄清的是,参数化查询是否与Npgsql中的预准备语句相同.如果我写下以下内容,没有明确的cmd.Prepare():

var cmd = new NpgsqlCommand("UPDATE foo SET bar=@bar;");
cmd.Parameters.Add("bar", 1);
cmd.ExecuteNonQuery();

在不考虑automatic preparation的影响的情况下,以上是内部准备的声明吗?相反,如果自动准备生效,它是否适用于所有查询,而不管它是否被参数化?

推荐答案

不,它们是两个完全正交的东西.参数化是从SQL中提取值,用占位符(@bar)替换它们,占位符引用带外数据.这可以防止SQL注入,并以更高效的二进制格式传输数据,而不是将其编码为SQL中的字符串.

准备好的语句是指只准备一次SQL,然后重用相同的准备好的语句,以避免每次数据库解析和规划SQL的开销.

在不考虑自动准备的影响的情况下,上述是内部准备的语句吗?

如果没有自动准备,此查询将在没有准备的情况下执行,即使它有参数也是如此.

相反,如果自动准备生效,它是否适用于所有查询,而不管它是否被参数化?

是-也可以准备不带任何参数的查询.这是有益的,因为无论查询是否具有参数,解析/计划查询都可能很复杂.

Postgresql相关问答推荐

如何获取实例化视图的列级权限?

数组格式类型的PostgreSQL日期

将数组的所有元素循环到jsonb中并修改值

从网址获取第一个字符串

JPA findBy 字段忽略大小写

Spring:如何在 PostgreSQL 中使用 KeyHolder

转换数组类型

PostgreSQL - 改变数字的精度?

postgresql查询中的正则表达式不区分大小写

PostgreSQL 查询到 Excel 表

在查询中的复合外键/主键列上连接表

如果 PostgreSQL 数据库中存在,则删除表

设置 Phoenix 框架和 Ecto 以使用 UUID:如何插入生成的值?

当成功有时会导致退出代码为 1 时,如何可靠地确定 pg_restore 是否成功?

仅在存在时重命名列

如何删除 Postgres 上的所有数据库?

在 Postgresql 中按窗口函数结果过滤

使用 Homebrew 安装 icu4c 版本 63

Postgresql 对象 ID 和元组

在 pg_restore 期间排除表