c# - Dapper Execute 函数可以调用 PostgreSQL 函数并返回受更新或插入影响的行

标签 c# postgresql sql-update sql-insert dapper

我正在尝试创建一个执行更新的 postgresql 函数。我想让行受到影响。我知道这可以通过使用 GET DIAGNOSTICS rows_affected = ROW_COUNT 来完成。但我正在尝试使用 Dapper Execute 函数,它可以返回自己受影响的行。据我所能确定的,只有当你有一个硬编码的查询你正在调用时,这才有效,例如在 C# 中

IDbConnection dbConnection = new NpgsqlConnection(strConnection)
string command = "UPDATE myschema.mytable SET email = '' WHERE email NOT LIKE '%@%';"
int rowsAffected = dbConnection.Execute(command);

我想创建一个做同样事情的函数,并让 Dapper 使用 Execute 调用它,而不是使用 Query。这是我目前所拥有的:

CREATE FUNCTION "Xtream"."fnUpdateUserID" () RETURNS VOID
AS $$
BEGIN
UPDATE myschema.mytable
SET email = ''
WHERE email NOT LIKE '%@%';
END;
$$ LANGUAGE 'plpgsql';

所以我的问题是,有没有办法在不向该函数添加类似 int return 的情况下使行受到影响?换句话说,可以访问以下信息:“查询成功返回:受影响的 2 行,执行时间 11 毫秒。”直接在 postgresql 查询窗口中调用 UPDATE myschema.mytable SET email = '' WHERE email NOT LIKE '%@%' 时返回。我知道 RETURNS VOID 对我的尝试不起作用。

换句话说,有没有办法在 PostgreSQL 插入或更新函数上使用 Dapper Execute

最佳答案

由于我一直无法找到一种方法来完成我想做的事情,所以我继续使用上面提到的 GET DIAGNOSTICS 解决方案。我将其发布为后代的答案。如果存在其他解决方案,我仍然欢迎。

修改函数如下:

CREATE FUNCTION "Xtream"."fnUpdateUserID" () RETURNS integer
AS $$
DECLARE rows_affected integer;
BEGIN
    UPDATE myschema.mytable
    SET email = ''
    WHERE email NOT LIKE '%@%';
    GET DIAGNOSTICS rows_affected = ROW_COUNT;
    RETURN rows_affected;
END;
$$ LANGUAGE 'plpgsql';

然后像这样更改 Dapper 调用:

IDbConnection dbConnection = new NpgsqlConnection(strConnection)
string command = "UPDATE myschema.mytable SET email = '' WHERE email NOT LIKE '%@%';"
int rowsAffected = dbConnection.Query<int>(command).FirstOrDefault;

关于c# - Dapper Execute 函数可以调用 PostgreSQL 函数并返回受更新或插入影响的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50993620/

相关文章:

node.js - Sequelize - 计算关联并从与查询的关联中获取数据

mysql - 使用表中的连接和更新计算列值

mysql - 如何根据其他表中的值编写更新

android.database.sqlite.SQLiteDatabase.rawQuery() 没有使用 SQLite datetime() 函数更新 DATETIME 列

c# - 手动将 MySQL 数据库表/字段映射到 C# 实体类

django - 子类化 django 字段

javascript - 根据 JSON 中的值更新到表中

c# - MemoryStream.SetLength(0) 和 MemoryStream.Capacity = 0 不会清除已用内存

c# - 在 finally block 中访问函数返回的值

c# - 同步调用 BackgroundWorker