10

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

提前致谢

4

4 回答 4

27

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

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

于 2011-04-23T16:33:16.647 回答
19
insert into pais(nombre, capital) values(@nombre, @capital) RETURNING id

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

Object res = query.ExecuteScalar();

在里面res你会有PK。

于 2013-12-24T09:39:23.933 回答
7

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

所以您的选择语句应如下所示:

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital);select currval('table_sequence');", conn);
于 2011-04-07T15:53:45.467 回答
3

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

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

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

然后 ExecuteScalar 将返回唯一的 id;

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

于 2011-04-07T15:36:28.090 回答