繁体   English   中英

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

[英]Retrieve serial ID with Npgsql when inserting with ExecuteScalar

我正在尝试使用串行主键将一行插入到 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 吗? 我错过了什么吗?

提前致谢

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

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。

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

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

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

插入本身不会导致返回值。 当您执行 ExecuteScalar 时,它正在寻找一个可以说是“选定”的值。

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

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

ExecuteScalar 然后会返回唯一的 id;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM