You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PostgreSQL插入查询结果赋值给C#变量?(替代Oracle语法)

适配PostgreSQL的插入语句及C#获取返回值方法

一、SQL语句改写

原Oracle插入语句依赖RETURNING ROWID INTO ?获取行标识,PostgreSQL不支持INTO子句,直接用RETURNING指定要返回的字段即可。另外注意PostgreSQL中GUID是关键字,需要用双引号转义。

改写后的语句(返回类似ROWID的ctid):

INSERT INTO table_2 (id, id_parent, id_type, name, alias, id_filewav, "GUID")
VALUES ($1, $2, $3, $4, $5, $6, $7)
RETURNING ctid;

更推荐的写法(返回主键id,如果id是表的唯一标识):

INSERT INTO table_2 (id, id_parent, id_type, name, alias, id_filewav, "GUID")
VALUES ($1, $2, $3, $4, $5, $6, $7)
RETURNING id;

注:ctid是PostgreSQL内部的行物理位置标识,可能会在VACUUM、数据重排等操作后变化,不适合作为持久化的唯一标识,优先返回业务主键更可靠。

二、C#中获取返回值的实现

1. 使用原生NpgsqlCommand

假设你已经通过NpgsqlConnection建立了数据库连接,示例代码如下:

using Npgsql;

// 初始化连接(示例,实际根据你的配置调整)
var connString = "Host=your_host;Username=your_user;Password=your_pwd;Database=your_db";
using var conn = new NpgsqlConnection(connString);
conn.Open();

// 创建命令
using var cmd = new NpgsqlCommand(@"
    INSERT INTO table_2 (id, id_parent, id_type, name, alias, id_filewav, ""GUID"")
    VALUES ($1, $2, $3, $4, $5, $6, $7)
    RETURNING id;", conn);

// 添加参数(替换为你的实际变量)
cmd.Parameters.AddWithValue("$1", 1001);
cmd.Parameters.AddWithValue("$2", 0);
cmd.Parameters.AddWithValue("$3", 1);
cmd.Parameters.AddWithValue("$4", "测试名称");
cmd.Parameters.AddWithValue("$5", "测试别名");
cmd.Parameters.AddWithValue("$6", "file_001");
cmd.Parameters.AddWithValue("$7", Guid.NewGuid());

// 执行并获取返回的主键值
var returnedId = (int)cmd.ExecuteScalar();

2. 使用Dapper简化操作

如果项目中使用Dapper ORM,代码会更简洁:

using Dapper;
using Npgsql;

var connString = "Host=your_host;Username=your_user;Password=your_pwd;Database=your_db";
using var conn = new NpgsqlConnection(connString);
conn.Open();

// 构造参数对象
var param = new
{
    Id = 1001,
    IdParent = 0,
    IdType = 1,
    Name = "测试名称",
    Alias = "测试别名",
    IdFilewav = "file_001",
    GUID = Guid.NewGuid()
};

// 执行插入并返回主键
var returnedId = conn.ExecuteScalar<int>(@"
    INSERT INTO table_2 (id, id_parent, id_type, name, alias, id_filewav, ""GUID"")
    VALUES (@Id, @IdParent, @IdType, @Name, @Alias, @IdFilewav, @GUID)
    RETURNING id;", param);

关键说明:

  • PostgreSQL的RETURNING语句执行后会返回一行结果,C#中通过ExecuteScalar获取单行单列的返回值;如果需要返回多个字段,可使用ExecuteReader或QueryFirst<T>读取整行数据。
  • 参数化查询的占位符,Npgsql既支持$n格式也支持?,但推荐使用$n更符合PostgreSQL习惯;Dapper则支持@参数名的写法。

内容的提问来源于stack exchange,提问作者Dog-programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:07:44