如何将数组作为参数传入存储过程?C#参数传递问题
解决C#调用PostgreSQL存储过程传递数组参数的问题
针对你遇到的PostgreSQL存储过程数组参数传递失败问题,以下是具体的解决方法:
核心原因
直接使用DbType.Int64传递数组无法被PostgreSQL识别,需要借助**Npgsql(PostgreSQL官方.NET数据提供者)**的原生数组支持来处理。
正确实现步骤
确保项目引用Npgsql
若未安装,通过NuGet安装:Install-Package Npgsql修改参数添加逻辑
替换原有参数添加代码,改用Npgsql提供的类型标识指定数组参数:// 假设parameters是NpgsqlParameterCollection类型 parameters.Add(new NpgsqlParameter("p_transactionids", NpgsqlDbType.Bigint | NpgsqlDbType.Array) { Value = entity.p_transactionids ?? Array.Empty<long>() // 避免传入null引发异常 });也可以用更简洁的写法:
parameters.AddWithValue("p_transactionids", NpgsqlDbType.Bigint | NpgsqlDbType.Array, entity.p_transactionids);验证参数类型匹配
确认存储过程中p_transactionids的参数类型是bigint[](对应C#的long[]);若存储过程定义的是integer[],则C#中需改用int[]类型,否则会出现类型不匹配错误。
完整调用示例参考
using (var conn = new NpgsqlConnection("你的PostgreSQL连接字符串")) { conn.Open(); using (var cmd = new NpgsqlCommand("SELECT * FROM \"transaction\".stp_txn_gettxndetails(@p1, @p2, @p3, @p4, @p5, @p_transactionids, @p6, @p7, @p8, @p9, @p10)", conn)) { // 添加常规参数 cmd.Parameters.AddWithValue("p1", 0); cmd.Parameters.AddWithValue("p2", 0); cmd.Parameters.AddWithValue("p3", 3); cmd.Parameters.AddWithValue("p4", DateTime.Parse("2005-03-01")); cmd.Parameters.AddWithValue("p5", DateTime.Parse("2023-03-28")); // 添加数组参数 cmd.Parameters.Add(new NpgsqlParameter("p_transactionids", NpgsqlDbType.Bigint | NpgsqlDbType.Array) { Value = entity.p_transactionids }); cmd.Parameters.AddWithValue("p6", 0); cmd.Parameters.AddWithValue("p7", 0); cmd.Parameters.AddWithValue("p8", 0); cmd.Parameters.AddWithValue("p9", "0"); cmd.Parameters.AddWithValue("p10", 0); // 执行并处理结果 using (var reader = cmd.ExecuteReader()) { // 读取数据逻辑 } } }
内容的提问来源于stack exchange,提问作者richamegha khatua
相关产品推荐
相关产品推荐

