postgres 返回 id 或 select currval(pg_get_serial_sequence('<table>','<id>')) 的 Dapper 问题?
Dapper issue with postgres returning id or select currval(pg_get_serial_sequence('<table>','<id>'))?
我正在尝试使用 Dapper、Npgsql 从 .net 应用程序连接到 postgres 数据库。插入后,我想知道插入行的 ID。我已阅读并尝试了选项 discussed here。
我试过像这样使用 returning id
:
id = connection.Execute("insert into document_tag (tag) values (@tag) returning id;",
new { tag },
transaction);
但我在 id 中只得到“1”。
我也试过这样使用 currval
:
id = connection.Execute("insert into document_tag (tag) values (@tag); select currval(pg_get_serial_sequence('document_tag','id'));",
new { tag },
transaction);
即使在这种情况下,我在 id
中也只得到“1”。
在这两种情况下,插入都是成功的,并且数据库中的 id 列具有除“1”之外的有效序列号。
我的期望是错误的还是有其他选择?
要插入一行并取回数据库生成的列,请使用:
INSERT INTO document_tag (tag) VALUES (@tag) RETURNING id
请注意 "RETURNING" 之前没有分号 - 它只是 INSERT 语句的一个子句,as you can see in the PostgreSQL docs.
此外,一旦您添加了 RETURNING 子句,INSERT 语句 returns 一个包含所请求信息的结果集,就好像您执行了 SELECT 语句一样。 Dapper 的 Execute()
意味着在没有结果集的情况下执行,因此您需要切换到 Query()
,并且可能添加一个 Single()
方法来提取您需要的单个值。另一种选择是 ExecuteScalar()
.
正如@Shay 所建议的那样:使用 connection.QueryFirst<int>
而不是 connection.Exeucte
并使其正常工作。更新的工作代码:
id = connection.QueryFirst<int>("insert into document_tag (tag) values (@tag) returning id;",
new { tag },
transaction);
我正在尝试使用 Dapper、Npgsql 从 .net 应用程序连接到 postgres 数据库。插入后,我想知道插入行的 ID。我已阅读并尝试了选项 discussed here。
我试过像这样使用 returning id
:
id = connection.Execute("insert into document_tag (tag) values (@tag) returning id;",
new { tag },
transaction);
但我在 id 中只得到“1”。
我也试过这样使用 currval
:
id = connection.Execute("insert into document_tag (tag) values (@tag); select currval(pg_get_serial_sequence('document_tag','id'));",
new { tag },
transaction);
即使在这种情况下,我在 id
中也只得到“1”。
在这两种情况下,插入都是成功的,并且数据库中的 id 列具有除“1”之外的有效序列号。
我的期望是错误的还是有其他选择?
要插入一行并取回数据库生成的列,请使用:
INSERT INTO document_tag (tag) VALUES (@tag) RETURNING id
请注意 "RETURNING" 之前没有分号 - 它只是 INSERT 语句的一个子句,as you can see in the PostgreSQL docs.
此外,一旦您添加了 RETURNING 子句,INSERT 语句 returns 一个包含所请求信息的结果集,就好像您执行了 SELECT 语句一样。 Dapper 的 Execute()
意味着在没有结果集的情况下执行,因此您需要切换到 Query()
,并且可能添加一个 Single()
方法来提取您需要的单个值。另一种选择是 ExecuteScalar()
.
正如@Shay 所建议的那样:使用 connection.QueryFirst<int>
而不是 connection.Exeucte
并使其正常工作。更新的工作代码:
id = connection.QueryFirst<int>("insert into document_tag (tag) values (@tag) returning id;",
new { tag },
transaction);