【发布时间】: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