【问题标题】:Return ID of newly inserted row on a PostgreSQL database using C# and Npgsql?使用 C# 和 Npgsql 返回 PostgreSQL 数据库上新插入行的 ID?
【发布时间】:2020-07-18 19:55:04
【问题描述】:

我正在使用 PostgreSQL 数据库和 Npgsql 框架在 C# 中构建一个 WinForms 项目。

为了插入一条记录,我需要返回新记录的 ID。 This SO question 表示将 SELECT SCOPE_IDENTITY() 添加到传递给 cmd 的查询字符串中。所以我的查询字符串如下所示:

string insertString = "INSERT INTO sometable (company_name, category, old_value, old_desc, new_value, new_desc, reference1, reference2) VALUES (@comp, @cat, @oldValue, @oldDesc, @newValue, @newDesc, @ref1, @ref2); SELECT SCOPE_IDENTITY();";

然后用类似的东西获取 ID

int modified = cmd.ExecuteNonQuery();

但这可能是特定于 SQL Server 的。如果我使用该方法,我会在上面的行中得到一个异常,说“函数 scope_identity() 不存在”。

我在Npgsql documentation 上找不到任何似乎可以解决此问题的内容。

根据链接的 SO 问题和 Denis 的建议,我尝试同时添加两者

RETURNING id;

CURRVAL(pg_get_serial_sequence('my_tbl_name','id_col_name'))

到查询字符串,用上面代码中的那些语句替换SELECT SCOPE_IDENTITY();。在这两种情况下,它们在插入时在 DBeaver 中按预期工作,但在我的 WinForm 项目中的 C# 代码中,modified 设置为“1”。

注意:我重新命名了问题并添加了有关我所做工作的更多信息。

【问题讨论】:

  • PostgreSQL 中没有 SCOPE_IDENTITY 函数。看到这个话题:stackoverflow.com/questions/2944297/…
  • @DenisStukalov,感谢您的链接。我在查询字符串中添加了RETURNING id; 并单独留下了ExecuteNonQuery 行,希望它将id 放入modified,但是当我运行它时,modified 的值是“1”。我在 DBeaver 中尝试了查询,它返回了新行的 ID,所以我不确定如何在我的 C# 代码中访问该值。
  • 我认为,你最好使用这个表达式 - SELECT CURRVAL(pg_get_serial_sequence('my_tbl_name','id_col_name')) 然后用户 cmd.ExecuteScalar() 来填充“修改”变量
  • 我刚刚尝试过,但modified 变量仍然是 1。
  • CURRVAL 也可以在 DBeaver 中使用插入功能,但就像 RETURNING,在我的 WinForm C# 代码中,modified 只是设置为 1。

标签: c# postgresql winforms npgsql executenonquery


【解决方案1】:

将“returning idcolumn”添加到 sql 查询的末尾,然后使用 ExecuteScalar() 方法而不是 ExecuteNonQuery() 运行命令。它应该返回一个 int。

string insert = "insert into table1 (col1) values (something) returning idcol";
int id = cmd.ExecuteScalar();

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多