Retrieve serial ID with Npgsql when inserting with ExecuteScalar

Is that thread safe?
What if another insert happens between your insert and select? Why not use:

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


The insert itself does not cause a value to be returned. When you perform ExecuteScalar it is looking for a single value to be "Selected" so to speak.

I believe you need to follow up your insert with a select statement to solve your issue.
If you were using t-sql you would do this like so

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

ExecuteScalar would then return the unique id;

I am not sure of the exact syntax for postGresql but hopefully this allows you to solve your issue.


In order to select the last identity inserted you need to use: currval(sequencename)

so your select statement should look like:

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

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

replace id with your primary keyenter code here and use

Object res = query.ExecuteScalar();

Inside res you'll have the PK.

Tags:

C#

.Net

Npgsql