使用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
线程安全吗?
如果在插入和选择之间发生了另一次插入,该怎么办?为什么不用:
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的确切语法,但希望这能让你解决你的问题。