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 的下一个主键值。
在将查询发送到数据库时生成下一个主键值的任何想法或代码片段?
您可以使用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)
插入新对象时,您应该使用序列在数据库内自动生成主 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 并返回它。