Dapper问题与postgres返回ID或选择currval(pg_get_serial_sequence('','<id>')))吗?

时间:2019-01-04 22:55:53

标签: postgresql dapper npgsql

我正在尝试使用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'。

我的期望是错误的还是有其他选择?

2 个答案:

答案 0 :(得分:1)

要插入一行并返回数据库生成的列,请使用:

INSERT INTO document_tag (tag) VALUES (@tag) RETURNING id

请注意,在“ RETURNING”之前没有分号-它只是INSERT语句as you can see in the PostgreSQL docs的子句。

此外,一旦添加了RETURNING子句,则INSERT语句将返回包含所请求信息的结果集,就像执行SELECT语句一样。 Dapper的Execute()可以在没有结果集的情况下执行,因此您将需要切换到Query(),并可能添加Single()方法来提取所需的单个值。另一种选择是ExecuteScalar()

答案 1 :(得分:0)

如@Shay所建议:使用connection.QueryFirst<int>代替connection.Exeucte并使其正常工作。更新的工作代码:

id = connection.QueryFirst<int>("insert into document_tag (tag) values (@tag) returning id;",
        new { tag },
        transaction);