我正在使用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的下一个主键值。
在将查询发送到数据库时生成下一个主键值的任何想法或代码片段?
答案 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并返回它。