C#调用PostgreSQL自定义更新函数报错42883(函数不存在)如何解决?
问题原因
你遇到的报错核心是参数类型不匹配:你在PostgreSQL函数中定义的_cus_id入参是integer整数类型,但在C#调用代码中,你将_cus_id的值调用了ToString()转为字符串后传入,PostgreSQL无法隐式将字符串转换为整数匹配函数签名,因此抛出参数不存在的错误。
解决方案
修改button2_Click方法中_cus_id的参数赋值逻辑,将字符串改为整数类型传入:
把原代码:
cmd.Parameters.AddWithValue("_cus_id", r.Cells["_cus_id"].Value.ToString());
修改为:
cmd.Parameters.AddWithValue("_cus_id", Convert.ToInt32(r.Cells["_cus_id"].Value));
为了避免Npgsql的参数类型推断出现偏差,更稳妥的写法是显式指定参数类型:
cmd.Parameters.Add("_cus_id", NpgsqlTypes.NpgsqlDbType.Integer).Value = Convert.ToInt32(r.Cells["_cus_id"].Value);
额外优化建议
- 建议用
using语句包裹NpgsqlConnection、NpgsqlCommand对象,会自动在代码执行结束后释放资源,不需要手动调用conn.Close(),也不会出现异常场景下连接未关闭的问题。 - 你当前的代码只在更新返回值为1时关闭了数据库连接,如果返回值为0则会一直占用连接,用
using可以规避这类资源泄漏问题。
内容的提问来源于stack exchange,提问作者Vel_More
相关产品推荐
相关产品推荐

