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