【问题标题】:C# Load a date from a string into a datetimepickerC# 将字符串中的日期加载到 datetimepicker
【发布时间】:2014-06-24 05:20:53
【问题描述】:

我正在尝试更新我沿途继承的旧 c# 程序。变化不大,只是添加了一些新字段等。我使用的是 Visual Studio 2008。

具体来说,我正在尝试从 SQL 表中读取日期时间并将其插入到 DateTimePicker 中,以便用户可以在屏幕上读取/修改它。

我尝试了几种不同的方法来做到这一点,但下面的代码似乎是最明智的。

我已将日期时间字符串从我的 SQL 数据库中读入一个日期时间变量。

我可以在消息框中显示该值没有问题,但是当我尝试将其加载到 dateTimePicker 控件中时,我得到一个异常。

消息框中显示的日期如下所示。 2015 年 6 月 24 日上午 12:00:00 (澳大利亚的日期格式是正确的,我不在乎时间是什么)

“对象引用未设置为对象的实例” _COMPlusExceptionCode = -532459699

while (sqlDR.Read())
{
    this.textBoxFixedAmountStreetNumber.Text = sqlDR["lStreetNumber"].ToString() + sqlDR["sStreetNumberSuffix"].ToString();
    this.textBoxFixedAmountStreetName.Text = sqlDR["sStreet"].ToString();
    this.textBoxFixedAmountSuburb.Text = sqlDR["sTown"].ToString();
    DateTime dateString = Convert.ToDateTime(sqlDR["dFixedAmountEndDate"].ToString());
    MessageBox.Show("dFixedAmountEndDate=" + dateString, "Debug", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    this.dateTimePickerFixedAmountEndDate.Value = dateString;
}

我可能是世界上最年长的新手,因为我主要做系统管理员,从不专注于单一的编程语言。 :)

非常感谢任何关于我做错了什么的想法。

谢谢 大卫

【问题讨论】:

  • 数据库中dFixedAmountEndDate列的数据类型是什么?
  • 数据类型为日期时间
  • 那你为什么要将DateTime 转换为String,然后又转换回DateTime?只需将原始DateTime 分配给Value 属性:this.dateTimePickerFixedAmountEndDate.Value = (DateTime) sqlDR["dFixedAmountEndDate"];

标签: c# datetimepicker


【解决方案1】:

这条线不好:

DateTime dateString = Convert.ToDateTime(sqlDR["dFixedAmountEndDate"].ToString());

这是它的替代品:

DateTime fixedAmountEndDate = (DateTime) sqlDR["dFixedAmountEndDate"];

不要在非必要时转换为字符串,并使用有意义的名称。

但是,如果您收到 "Object Reference not set to an instance of an object" - 那就是 NullReferenceException。有可能您的 SQL 字段之一在数据库中可以为空并且包含空值。您需要明确测试该条件,因为DateTime 不能为空,DateTimePicker.Value 也不能。

if (sqlDR["dFixedAmountEndDate"] == DBNull.Value)
    // do something.  Perhaps hide the field, etc.

【讨论】:

  • 我按照您的建议修改了代码。不要为了好玩而将日期转换为字符串然后再转换回日期是有意义的。但是我仍然得到错误。当执行将值分配给 datetimepicker 的行时,“对象引用未设置为对象的实例”。
  • 是的,那么你可能有一个空值。要么,要么您没有对选取器控件的有效引用。做一些调试。设置断点并单步执行。一旦你看到这些值是什么,问题就应该很明显了。
  • 数据库中的日期字段确实允许空值,尽管我正在处理的当前记录不是空值。我还没有所有行的有效数据,所以这就是我选择允许空值的原因。我将尝试将其更改为不为空,并在 01/01/1900 中输入一个虚拟值。谢谢你的想法。我会告诉你它是否有效。
  • 我将 sql 表中的日期设置为“not null”,并将所有日期设置为 1900,这也没有帮助。绝望中,我从表单中删除了该字段,并使用相同的名称再次创建它,并重新构建了解决方案。现在它起作用了!我认为最后一根稻草是字段名称在某个地方搞砸了。它现在看起来更加专业,没有通过字符串变量的日期,并且将来可能不太可能在数据类型设置为非空时遇到问题。所以现在一切都好。谢谢!!!
【解决方案2】:

应该这样做:

var date_as string = "24/06/2015 12:00:00 AM";
DateTime date ;

DateTime.TryParse(d, out date);
// date now holds your date

编辑
正如其他 cmets 和 Matt 的回答所暗示的那样,您实际上并不需要解析字符串(因此,即使上述内容正确,也可能不是您想要的)。

如果你这样做,你可以使用bool result = DateTime.TryParse(d, out date);,如果结果是false,分配一个假日期(或者更好,当你定义日期时,你可以这样做:DateTime date = new DateTime();所以如果解析失败,你'日期仍然有效。

如果您采用其他方法,您可以通过测试 null 来实现相同的效果。无论哪种方式,您都应该意识到危险:)

【讨论】:

  • 如果你在谈论这个:"Object Reference not set to an instance of an object" _COMPlusExceptionCode = -532459699,这意味着解析失败(悲惨)。你可以有一个 bool result = DateTime.TryParse(d, out date) ,看看它是否成功。但以上在我的机器上工作。你在哪个时区?与输入日期时间相同,还是不同?0
  • 是的,一切都在一个时区完成。 (澳大利亚东部标准时间),即 UTC +10
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多