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

我正在尝试使用串行主键在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”值为null。 如果我使用nexval(’table_sequence’)插入也返回null。

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

提前致谢

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

所以你的select语句应如下所示:

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

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

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

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

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

 Object res = query.ExecuteScalar(); 

在里面res你会有PK。

插入本身不会导致返回值。 当你执行ExecuteScalar时,它正在寻找一个单独的值来“选择”可以这么说。

我相信你需要用select语句跟进你的插入来解决你的问题。
如果你使用t-sql,你会这样做

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

然后ExecuteScalar将返回唯一ID;

我不确定postGresql的确切语法,但希望这可以帮助您解决问题。