【问题标题】:Get affected rows PostgreSQL C#获取受影响的行 PostgreSQL C#
【发布时间】:2022-11-10 22:04:20
【问题描述】:

以前我有方法,这取决于我是否有版本,要么增加它,要么插入新列:

public void Increment(int id, long version)
    {
        if (version == 0)
        {
            _db.ExecuteNonQuery($@"
                INSERT INTO table (id, version)
                VALUES (:id, 0)
                ON CONFLICT DO NOTHING;
            ", _db.CreateParameter("id", id));
        }

        var affectedRows = _db.ExecuteNonQuery($@"
            UPDATE table
            SET version = version + 1
            WHERE id = :id AND version = :preVersion;
            ",
            _db.CreateParameter("id", id),
            _db.CreateParameter("version", preVersion));

        if (affectedRows != 1)
            throw new Exception("None Updated");
    }

现在我将不再将版本传递给我,所以我试图使用 IF EXISTS 语句来确定我应该插入还是更新。但是,问题是我编写 sql 的方式不会返回受影响的行数,我不知道如何更改它。目前它看起来像这样:

public void Increment(int id)
    {
        var affectedRows = _db.ExecuteNonQuery($@"
        DO
        $do$
        BEGIN
            IF EXISTS (SELECT 1 FROM table WHERE id = {id}) THEN
                UPDATE table
                SET version = version + 1, updated = '{DateTime.Now}'
                WHERE id = {id} AND (updated IS NULL);
            ELSE 
                INSERT INTO table (id, version, updated)
                VALUES ({id}, 0, '{DateTime.Now}');
            END IF;
        END
        $do$");

        if (affectedRows != 1)
            throw new Exception($"None updated");
    }

【问题讨论】:

    标签: c# postgresql asp.net-core .net-core


    【解决方案1】:

    假设 id 是主键或者它具有唯一约束,然后根据您的查询使用您的第二个示例。它会尝试插入,如果因为id 已经存在而失败,则更新,但前提是updated is null。我想这正是你的逻辑,但用普通的 SQL 重新排序和改写。

    INSERT INTO the_table (id, version, updated) VALUES ({id}, 0, current_timestamp)
    ON CONFLICT (id) DO UPDATE 
    SET version = version + 1, updated = current_timestamp WHERE updated IS NULL;
    

    我用 SQL 标准的current_timestamp 替换了{DateTime.Now},希望能提高可读性。

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2013-06-23
      • 2011-06-11
      • 2016-11-01
      • 2011-05-01
      • 1970-01-01
      • 2011-10-28
      • 2012-04-20
      • 2019-02-19
      相关资源
      最近更新 更多