我正在尝试创建一个执行更新的 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/