2011-04-07 47 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。

相關問題