Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将c#(asp.net core)datetime保存为PostgreSQL日期_C#_Postgresql_Asp.net Core_Npgsql - Fatal编程技术网

如何将c#(asp.net core)datetime保存为PostgreSQL日期

如何将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

我正在使用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.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;那么,你应该加上这个作为答案。