如何生成下一个主键值

时间:2011-12-02 14:34:34

标签: c# winforms postgresql npgsql

我正在使用Visual Studio 2010 PostgreSQL 9.x Npgsql的

我正在尝试从C#WinForms应用程序的字段插入数据。我无法弄清楚如何动态生成/检索下一个主键值。这是我的专栏名称:

epiphanyKey [PK] bigserial 交易数字 许可证字符 dateOfActv日期 时间

我需要insert命令为“会话安全”,因为多个人可能同时将数据输入数据库。

 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 个答案:

答案 0 :(得分:4)

您可以使用returning关键字使查询返回刚刚创建的ID。 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();

答案 1 :(得分:3)

在插入新对象时,您应该使用Sequences在数据库中自动生成主ID。

对于更详细的答案(代码),我需要知道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中编写一个存储函数,它将接受你的字段值作为输入参数,将值插入表中,获取最后一个插入ID并返回它。