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

时间:2018-06-22 18:18:04

标签: 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的内容?换句话说,可以访问以下信息:“查询成功返回:受影响的2行,执行时间为11毫秒”。直接在PostgreSQL查询窗口中调用UPDATE myschema.mytable SET email = '' WHERE email NOT LIKE '%@%'时返回。我知道RETURNS VOID不能满足我的要求。

用另一种方式表达这一点,是否可以在PostgreSQL插入或更新函数上使用Dapper Execute

1 个答案:

答案 0 :(得分:0)

由于我一直无法找到自己想要的方法,所以我继续使用上面提到的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;