2011-04-07 76 views
4

我试图用串行主键向PostgreSQL表中插入一行,并且我需要在插入后检索此列。我有这样的事情:当使用ExecuteScalar插入时使用Npgsql检索序列号

表“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?我错过了什么吗?

在此先感谢

+0

我不读你的查询为“选择”任何值作为标量返回? – 2011-04-07 15:31:16

回答

5

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

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

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

超凡!我尝试了lastval()并且工作,但没有query.Prepare()行,就像链接的文章一样。谢谢! – Cheluis 2011-04-07 16:09:44

2

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

我相信你需要通过select语句来跟踪你的插入来解决你的问题。
如果您使用T-SQL,你会做此像这样

串SQL = “INSERT INTO [表](字段名)VALUES(@ParamName);” +“SELECT CAST(SCOPE_IDENTITY()为INT )“;

ExecuteScalar然后会返回唯一的ID;

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

+0

谢谢,我将检查如何做postgres – Cheluis 2011-04-07 15:56:03

+1

它应该是字符串sql =“INSERT INTO [表](FieldName)VALUES(@ParamName);”+“选择CAST(lastval()AS整数)”; – Cheluis 2011-04-07 16:03:40

+0

太好了。感谢您澄清确切的语法。抱歉。多年来,我一直在sql server的土地上迷路。 :) – Matt 2011-04-07 16:53:06

12

是线程安全的?
如果在插入和选择之间发生另一次插入,该怎么办? 为什么不使用“INSERT INTO table(fieldnames)VALUES(values)RETURNING idcolumn”?

+0

clean solution :) – Florjon 2011-10-29 22:23:55

+2

如果select在同一个查询中,它是线程安全的,因为它位于http://www.postgresql.org/docs/8.4/interactive/functions-sequence的同一个“会话”中。html:“因为这是返回一个会话本地值,它会给出一个可预测的答案,无论其他会话是否从当前会话开始执行nextval。” – markmnl 2012-05-16 06:14:09

+0

我接受的答案并不适用。这一次,所以谢谢你加入它。 – Leonard 2013-02-25 09:40:00

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

取代id与主键enter code here和使用

Object res = query.ExecuteScalar(); 

里面res你就会有PK。