Как создать следующее значение первичного ключа - PullRequest
4 голосов
/ 02 декабря 2011

Я использую Visual Studio 2010 PostgreSQL 9.x Npgsql

Я пытаюсь вставить данные из полей в приложении C # WinForms.Я просто не могу понять, как сгенерировать / получить следующее значение первичного ключа на лету.Вот имена моих столбцов:

epiphanyKey [PK] символ цифровой лицензии для большой транзакции dateOfActv дата / время

Мне нужна команда вставки, чтобы быть "безопасным для сеанса", поскольку данные могли вводить несколько человекв базу данных одновременно.

 NpgsqlConnection conn = new NpgsqlConnection("Server=localhost;Port=5432;User Id=postgres;Password=password;Database=epiphany;"); // postgres 8.3 on my test system
 conn.Open(); // opens the connection

 NpgsqlCommand cmd = new NpgsqlCommand("INSERT INTO wsmsmrs210 (epiphanyKey,transaction,license,dateOfActv,time, conn);

   NpgsqlDataReader dr = cmd.ExecuteReader();

В приведенном выше коде оператор NpgsqlCommand cmd = ... работает неправильно, поскольку я не знаю следующего значения первичного ключа для значения первичного ключа epiphanyKey.

Есть идеи или фрагменты кода для генерации следующего значения первичного ключа при отправке запроса в базу данных?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2011

Вы можете использовать ключевое слово returning, чтобы запрос возвращал только что созданный идентификатор.Пример из the docs :

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
RETURNING did;

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

NpgsqlCommand cmd = new NpgsqlCommand(
  "INSERT INTO wsmsmrs210 " +
  "(epiphanyKey,transaction,license,dateOfActv,time, conn) " +
  "VALUES (...) " +
  "RETURNING epiphanyKey");

int id = cmd.ExecuteScalar();
3 голосов
/ 02 декабря 2011

Вы должны использовать Последовательности для автоматической генерации вашего основного идентификатора в базе данных при вставке новых объектов.

Для более подробного ответа (кода) мне нужно знать структуру таблицы wsmsmrs210.

Как правило, если ваша таблица данных создается с помощью:

CREATE SEQUENCE sequence_name;

CREATE TABLE wsmsmrs210 (
epiphanyKey bigint default nextval('sequence_name'),
...
)

тогда ваш код должен выглядеть так:

NpgsqlConnection conn = new NpgsqlConnection("Server=localhost;Port=5432;User Id=postgres;Password=password;Database=epiphany;"); 
 conn.Open(); // opens the connection

NpgsqlCommand cmd = new NpgsqlCommand("INSERT INTO wsmsmrs210 (transaction,license,dateOfActv,time) VALUES(:a,:b,:c,:d)", conn);
... // add parameters :a, :b, :c, :d via cmd.Parameters.Add(...) here
cmd.ExecuteNonQuery();

// Add next two lines if you need last inserted id in code
cmd = new NpgsqlCommand("SELECT CURRVAL('sequence_name')", conn);
var id = cmd.ExecuteScalar(); 


conn.Close();

Если вы хотите иметь максимальную надежность, вам следует написать хранимую функцию в PLPGSQL, которая будет принимать значения ваших полей в качестве входных параметров, вставлять значение в таблицу, получать последний идентификатор вставки и возвращать его.

...