Получить серийный идентификатор с помощью Npgsql при вставке с помощью ExecuteScalar - PullRequest
7 голосов
/ 07 апреля 2011

Я пытаюсь вставить строку в таблицу PostgreSQL с серийным первичным ключом, и мне нужно получить этот столбец после того, как он был вставлен.Я получил что-то вроде этого:

Таблица "Pais" имеет 3 столбца: ID, Pais, заглавная;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') также возвращает ноль.

Есть идеи, как я могу вернуть идентификатор таблицы?Я что-то упустил?

Заранее спасибо

Ответы [ 4 ]

16 голосов
/ 23 апреля 2011

Этот поток безопасен?
Что, если между вашей вставкой и выбором будет другая вставка? Почему бы не использовать:

INSERT INTO table (fieldnames) VALUES (values) RETURNING idcolumn * * 1005

10 голосов
/ 24 декабря 2013
insert into pais(nombre, capital) values(@nombre, @capital) RETURNING id

замените id вашим первичным ключом enter code here и используйте

Object res = query.ExecuteScalar();

Внутри res у вас будет PK.

6 голосов
/ 07 апреля 2011

Для выбора последней вставленной личности вам необходимо использовать: currval(sequencename)

, поэтому ваш оператор выбора должен выглядеть так:

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital);select currval('table_sequence');", conn);
2 голосов
/ 07 апреля 2011

Сама вставка не приводит к возвращению значения. Когда вы выполняете ExecuteScalar, он ищет отдельное значение, так сказать, «Выбранное».

Я полагаю, что для решения вашей проблемы вам необходимо дополнить вкладыш утверждением выбора.
Если бы вы использовали t-sql, вы бы сделали это так

строка sql = "INSERT INTO [Table] (FieldName) VALUES (@ParamName);" + "ВЫБЕРИТЕ CAST (scope_identity () AS int)";

ExecuteScalar возвращает уникальный идентификатор;

Я не уверен в точном синтаксисе postGresql, но, надеюсь, это позволит вам решить вашу проблему.

...