AddDays()方法c#出错[关闭]
Posted
技术标签:
【中文标题】AddDays()方法c#出错[关闭]【英文标题】:error with AddDays() method c# [closed] 【发布时间】:2017-12-29 20:47:01 【问题描述】:我使用 adddays() 方法计算从今天起 7 天和 28 天后的日期,或者当我尝试将值插入数据库表字段 currect_date 和 crush_date 日期类型字段时的任何日期,它显示 adddays(28) 值是不是正确的日期/时间值。
DateTime d = new DateTime();
d = DateTime.Today;
cmd = new SqlCommand("insert into sq_crush (currect_date,crush_date) values ('" + d.AddDays(7).ToShortDateString() + "','" + d.AddDays(28).ToShortDateString() + "')", cn);
if (cn.State == ConnectionState.Closed)
cn.Open();
// MessageBox.Show(dd);
cmd.ExecuteNonQuery();
如果我将 28 更改为 14,它可以正常工作,但如果我使用超过 14 的任何值,它会显示相同的错误 “从字符串转换日期和/或时间时转换失败。” 如何使其工作,因为它适用于 14 以下的值,以及是否有任何其他方法可以获取 28 或 23 之后或某个特定日期之后的任意天数的日期。
一般来说,我想在三个字段中插入日期,第一个是今天,第二个是从第一个日期算起 7 天后的日期,我对此没有任何问题,最后一个是 28 天后的日期 请帮帮我
【问题讨论】:
阅读错误消息 - 是什么让您认为更改AddDays()
值与转换有关?你为什么要传递日期值的字符串?
【参考方案1】:
当您将日期作为字符串传递时,就会出现这种问题。您不一定知道正确的格式是什么,听起来您的 SQL Server 不同意月份的位置(在字符串中的第一位或第二位);当您提供的日期太高而不能成为一个月时,SQL Server 会引发错误。
您可以通过将日期作为 DateTime 参数传递来避免整个问题(以及其他问题),如下所示:
DateTime d = DateTime.Today;
var sql = "insert into sq_crush (currect_date,crush_date) values (@date1,@date2)";
var cmd = new SqlCommand(sql, cn);
cmd.Parameters.AddWithValue("@date1", d.AddDays(7));
cmd.Parameters.AddWithValue("@date2", d.AddDays(28));
if (cn.State == ConnectionState.Closed)
cn.Open();
cmd.ExecuteNonQuery();
通常是bad idea to concatenate strings to form SQL (link)。
【讨论】:
【参考方案2】:那是因为 14 天会让你超过 12 天。因此,假设您提供的格式与 SQL 服务器认为您提供的格式不同。
如果您选择不使用参数化查询,那么您的日期格式应该与 SQL Server 的预期相匹配。
【讨论】:
12 号以后是什么? 嗯……一年只有 12 个月。因此,SQL 服务器必须认为您的日子是在值 12 之后的几个月。这就是您应该格式化日期或使用参数化查询的原因。您可以使用带有格式的 ToString 来匹配 SQL 服务器期望的格式,通常是 ToString("yyyy-MM-dd") 请记住,15 天后是 1 月 13 日。但是从现在开始的 14 天是 1 月 12 日,这就是为什么您在 14 天之后会遇到问题,因为它认为 13 天是月份字段而不是日期字段。 如果它需要 14 作为一个月,它会自动将年份更改为 2019 这不是问题我使用 d.adddays(28) 作为 message 和 label.text 的字符串值或任何它28 天后正确显示日期,但当我尝试将其插入 dB 时,显示错误以上是关于AddDays()方法c#出错[关闭]的主要内容,如果未能解决你的问题,请参考以下文章