如何将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
相关产品推荐
相关产品推荐

