我正在尝试使用串行主键在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?我错过了什么吗?
提前致谢
答案 0 :(得分:16)
该线程安全吗? 如果在插入和选择之间发生了另一次插入怎么办? 为什么不使用:
INSERT INTO table (fieldnames) VALUES (values) RETURNING idcolumn
?
答案 1 :(得分:10)
insert into pais(nombre, capital) values(@nombre, @capital) RETURNING id
将id
替换为您的主键enter code here
并使用
Object res = query.ExecuteScalar();
在res
内,您将拥有PK。
答案 2 :(得分:6)
要选择插入的最后一个身份,您需要使用:currval(sequencename)
所以你的select语句应如下所示:
NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital);select currval('table_sequence');", conn);
答案 3 :(得分:2)
插入本身不会导致返回值。当你执行ExecuteScalar时,它正在寻找一个单独的值来“选择”可以这么说。
我认为您需要使用select语句跟进您的插入内容以解决您的问题 如果你使用的是t-sql,你会这样做
string sql = “INSERT INTO [Table](FieldName)VALUES(@ParamName);” +“SELECT CAST(scope_identity()AS int)”;
然后,ExecuteScalar将返回唯一ID;
我不确定postGresql的确切语法,但希望这可以帮助您解决问题。