如何将C#(ASP.NET Core) DateTime保存到PostgreSQL Date类型
解决Npgsql传递DateTime到PostgreSQL Date类型参数的函数匹配问题
我之前也碰到过完全一样的坑!当你用C#的DateTime传参给PostgreSQL的date类型参数时,Npgsql默认的类型映射会把DateTime转换成PostgreSQL的timestamp类型,这就导致数据库找不到参数类型匹配的函数——哪怕你取了DateTime.Date属性也没用,因为Date返回的还是一个DateTime对象(时间部分为00:00),Npgsql依然会按timestamp来解析它。
给你几个亲测有效的解决方法:
显式指定参数的NpgsqlDbType
直接在创建参数时指定类型为NpgsqlDbType.Date,强制Npgsql按date类型传递:var cmd = new NpgsqlCommand("your_function_name", connection); cmd.CommandType = CommandType.StoredProcedure; // 关键:指定参数类型为Date cmd.Parameters.Add(new NpgsqlParameter("your_date_param", NpgsqlDbType.Date) { Value = yourDateTimeVariable.Date });使用Npgsql专属的NpgsqlDate类型
Npgsql提供了专门对应PostgreSQLdate类型的NpgsqlDate结构体,用它来传参就不会有类型映射混淆的问题:var npgsqlDate = NpgsqlDate.FromDateTime(yourDateTimeVariable); cmd.Parameters.AddWithValue("your_date_param", npgsqlDate);最后再检查一遍函数定义
确认你的PostgreSQL函数参数确实是date类型,而不是timestamp或者其他类型,同时检查参数的顺序和数量是否和你代码中传递的完全一致——有时候重载函数或者参数顺序错了也会抛出这个异常。
内容的提问来源于stack exchange,提问作者Diego Alves
相关产品推荐
相关产品推荐

