如何生成下一个主键值

Ben*_*Cox 4 c# postgresql npgsql winforms

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

我正在尝试从 C# WinForms 应用程序上的字段插入数据。我只是不知道如何即时生成/检索下一个主键值。这是我的列名:

EpiphanyKey [PK] bigserial 交易数字许可证字符 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();
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,NpgsqlCommand cmd = ... 语句无法正常工作,因为我不知道主键值 epiphanyKey 的下一个主键值。

在将查询发送到数据库时生成下一个主键值的任何想法或代码片段?

Guf*_*ffa 5

您可以使用returning关键字使查询返回刚刚创建的 id。文档中的示例:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
RETURNING did;
Run Code Online (Sandbox Code Playgroud)

您发布的代码不完整,甚至无法编译,因此我无法为您提供如何在您的情况下使用它的完整示例,但这是一个开始:

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

int id = cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)


Ser*_*sev 4

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

对于更详细的答案(代码),我需要了解wsmsmrs210表结构。

一般来说,如果您的数据表是使用以下命令创建的:

CREATE SEQUENCE sequence_name;

CREATE TABLE wsmsmrs210 (
epiphanyKey bigint default nextval('sequence_name'),
...
)
Run Code Online (Sandbox Code Playgroud)

那么你的代码应该如下所示:

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();
Run Code Online (Sandbox Code Playgroud)

如果您想获得最大的可靠性,那么您应该在 PLPGSQL 中编写一个存储函数,该函数将接受字段值作为输入参数,将值插入表中,获取最后插入 id 并返回它。