gpt4 book ai didi

c# - 如何将 c# (asp.net core) 日期时间保存到 PostgreSQL 日期

转载 作者:行者123 更新时间:2023-11-29 13:15:57 25 4
gpt4 key购买 nike

我正在使用 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);

我在 SO 中阅读了一些帖子,他们说使用属性 Date 可以解决,但它对我不起作用。

  //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 数据类型呈现为时间戳。如果您的数据库类型实际上是日期,则执行将因数据类型不匹配而失败。

对于字符串、整数、小数和 double ,AddWithValue 似乎总是完全按预期工作,但如果您的日期是 [PostgreSQL] DATE,那么您需要明确参数声明的数据类型。总的来说,这是一个很好的做法:

cmd.Parameters.Add(new NpgsqlParameter("@birth_date", NpgsqlTypes.NpgsqlDbType.Date));
cmd.Parameters[0].Value = cliente.BirthDate;

如果您像这样进行多项交易,这绝对优于 AddWithValue:

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;

我认为这并不比其他选项更容易,但这是一个可行的选项。

关于c# - 如何将 c# (asp.net core) 日期时间保存到 PostgreSQL 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48974702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com