如何将c#(asp.net core)datetime保存为PostgreSQL日期
我正在使用npgsql包将参数传递给postgresql函数。但我得到的一个例外是,没有定义具有指定数量/类型参数的函数。我经历了测试所有参数的麻烦,我确信导致问题的是传递给postgresql日期数据类型的c#datetime参数 我最初试过这个:如何将c#(asp.net core)datetime保存为PostgreSQL日期,c#,postgresql,asp.net-core,npgsql,C#,Postgresql,Asp.net Core,Npgsql,我正在使用npgsql包将参数传递给postgresql函数。但我得到的一个例外是,没有定义具有指定数量/类型参数的函数。我经历了测试所有参数的麻烦,我确信导致问题的是传递给postgresql日期数据类型的c#datetime参数 我最初试过这个: //here BirthDate is Datetime, as it doesn't seem // to have another built-in date type in asp.net core cmd.Parameters
//here BirthDate is Datetime, as it doesn't seem
// to have another built-in date type in asp.net core
cmd.Parameters.AddWithValue("@birth_date", cliente.BirthDate);
我在这里读了一些帖子,他们说使用财产日期可以解决问题,但这对我不起作用
//doesn't work either
cmd.Parameters.AddWithValue("@birth_date", cliente.BirthDate.Date);
NpgSql的
AddWithValue
尽力将C#属性的数据类型映射到PostgreSQL字段的数据类型,但问题是PostgreSQL有两个主要的日期数据类型:
日期
时间戳
但是C只有一个--System.DateTime
。因此,即使是DateTime
对象的.Date
属性也会生成DateTime
类型
换句话说,NpgSql必须做出选择——它将PostgreSQL数据类型呈现为时间戳。如果数据库类型实际上是日期,则由于数据类型不匹配,执行将失败
对于字符串、整数、小数和双精度AddWithValue
似乎总是完全按照预期工作,但如果日期是[PostgreSQL]日期,则需要明确参数声明的数据类型。总之,这是一种良好的做法:
cmd.Parameters.Add(new NpgsqlParameter("@birth_date", NpgsqlTypes.NpgsqlDbType.Date));
cmd.Parameters[0].Value = cliente.BirthDate;
如果您正在执行这样的多个事务,这肯定比添加WithValue有利:
cmd.Parameters.Add(new NpgsqlParameter("@birth_date", NpgsqlTypes.NpgsqlDbType.Date));
cmd.Parameters.Add(new NpgsqlParameter("@user_id", NpgsqlTypes.NpgsqlDbType.Integer));
foreach (User u in Users)
{
cmd.Parameters[0].Value = u.Birthday;
cmd.Parameters[1].Value = u.UserId;
cmd.ExecuteNonQuery();
}
对于单个查询或事务,您还可以使用速记:
cmd.Parameters.Add(new NpgsqlParameter("@birth_date", NpgsqlTypes.NpgsqlDbType.Date)).
Value = cliente.BirthDate;
作为最后一种选择,您可以在以下事实之后“修复”dbtype:
cmd.Parameters.AddWithValue("@birth_date", cliente.BirthDate);
cmd.Parameters[0].NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Date;
我不认为这比其他选项更容易,但这是一个可行的选项。有人发布了一条评论,但删除了它,上面说我可以使用cmd.Parameters.Add(),它成功了。cmd.Parameters.Add(“@birth_date”,NpgsqlTypes.NpgsqlDbType.date,20)。Value=cliente.BirthDate.date;那么,你应该加上这个作为答案。