我正在尝试更新我沿途继承的旧c#程序。没有太大的变化,只是添加一些新的字段等。我使用的是Visual Studio 2008。
具体来说,我试图从SQL表中读取日期时间并将其插入到DateTimePicker中,以便用户可以在屏幕上阅读/修改它。
我尝试了几种不同的方法来做到这一点,但下面的代码似乎是最明智的。
我已经将日期时间字符串从我的SQL数据库读入日期时间变量。
我可以在消息框中显示该值没问题,但是当我尝试将其加载到dateTimePicker控件时,我得到一个异常。
消息框中显示的日期如下所示。 24/06/2015 12:00:00 AM (澳大利亚日期格式是正确的,我不在乎时间)
"对象引用未设置为对象的实例" _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;
}
我可能是世界上最古老的新手,因为我主要使用系统管理员而且从不专注于单一的编程语言。 :)
非常感谢任何关于我做错事的想法。
由于 大卫
答案 0 :(得分:0)
这应该这样做:
var date_as string = "24/06/2015 12:00:00 AM";
DateTime date ;
DateTime.TryParse(d, out date);
// date now holds your date
修改强>:
正如其他评论和Matt的回答所暗示的那样,你并不需要解析一个字符串(所以即使正确,上面的内容可能不是你想要的)。
如果你这样做,你可以使用bool result = DateTime.TryParse(d, out date);
,如果结果是false
,则指定一个假日期(或更好,当你定义日期时,你可以这样做:DateTime date = new DateTime();
所以如果解析失败,你仍然有一个有效的日期。
如果你采用其他方法,你可以通过测试null来实现同样的目的。无论哪种方式,你应该意识到危险:)
答案 1 :(得分:0)
这条线很糟糕:
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.