使用ExecuteScalar插入时,使用Npgsql检索序列号

本文关键字:使用 检索 序列号 Npgsql ExecuteScalar 插入 | 更新日期: 2023-09-27 17:49:28

我正试图将一行插入到具有串行主键的PostgreSQL表中,我需要在插入后检索此列。我得到了这样的东西:

表"pais"有3列:id, pais, capital;Id是一个串行列,是它的主键。

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital)", conn);
query.Parameters.Add(new NpgsqlParameter("nombre", NpgsqlDbType.Varchar));
query.Parameters.Add(new NpgsqlParameter("capital", NpgsqlDbType.Varchar));
query.Prepare();
query.Parameters[0].Value = this.textBox1.Text;
query.Parameters[1].Value = this.textBox2.Text;
Object res = query.ExecuteScalar();
Console.WriteLine(res);

将行插入到表中,但"res"值为空。如果我插入nexval('table_sequence')也返回null。

知道如何返回表的id吗?我错过什么了吗?

Thanks in advance

使用ExecuteScalar插入时,使用Npgsql检索序列号

线程安全吗?
如果在插入和选择之间发生了另一次插入,该怎么办?为什么不用:

INSERT INTO table (fieldnames) VALUES (values) RETURNING idcolumn ?

insert into pais(nombre, capital) values(@nombre, @capital) RETURNING id

用主键enter code here替换id并使用

Object res = query.ExecuteScalar();

res里面有PK

为了选择最后插入的标识,您需要使用:currval(sequencename)

所以你的select语句应该是这样的:

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital);select currval('table_sequence');", conn);

插入本身不会导致返回值。当你执行ExecuteScalar,它正在寻找一个单一的值被"选定",所以说。

我相信你需要在insert语句之后加上select语句来解决你的问题。
如果你使用的是t-sql,你可以这样做

string SQL ="INSERT INTO [Table] (FieldName) VALUES (@ParamName); "+ "SELECT CAST(scope_identity() AS int);

ExecuteScalar将返回唯一的id;

我不确定postGresql的确切语法,但希望这能让你解决你的问题。