在 .net 6 中使用复合参数调用 Postgres 过程

Call Postgres procedure with Composite param in .net 6

提问人:User7291 提问时间:10/26/2023 更新时间:10/26/2023 访问量:19

问:

我已经在 postgres 中创建了一个自定义类型作为复合类型,并将其作为参数传递给过程,我想从 .net 6 调用该过程,但我一直收到错误"InvalidCastException: Can't convert .NET type 'ArtProductService.Models.Dtos.BulkUpdateAcquisitionDto' to PostgreSQL '.<unknown>' within an array"

这是我的职能

  var dataSourceBuilder = new NpgsqlDataSourceBuilder(_connectionString);
  dataSourceBuilder.MapComposite<List<myObject>>("composite[]");
  await using var dataSource = dataSourceBuilder.Build();
  using var conn = dataSource.CreateConnection();
  conn.ConnectionString = _connectionString;

  string query = "\"schema\".\"procedureName\"";
  conn.Open();
  NpgsqlCommand command = new NpgsqlCommand(query, conn);

  var param = command.CreateParameter();
  param.ParameterName = "paramName";

  param.Value = paramValue;
  param.DataTypeName = "composite[]";

  command.CommandType = CommandType.StoredProcedure;
  command.Parameters.Add(param);
  await command.ExecuteNonQueryAsync();
  
PostgreSQL ado.net net-6.0 npgsql

评论


答:

1赞 Shay Rojansky 10/26/2023 #1
dataSourceBuilder.MapComposite<List<myObject>>("composite[]");

数组本身(或 List)不是复合对象;尝试映射基本类型:

dataSourceBuilder.MapComposite<myObject>("composite");

当您执行上述操作时,Npgsql 也会自动完成数组映射。

(还要确保你真的希望你的 PG 类型被实际调用——对于一个类型来说,这是一个非常糟糕的名字)。composite

如果这没有帮助,请在上面发布一个完全可运行的代码示例,而不是一个片段。