我在获取更新的时间戳值时遇到问题,该值返回0000-00-00 00:00:00
。我的阅读器无法读取显示错误Invalid DateTime
的数据。
我只想获取TimeIn和TimeOut字段下的时间。
这是我的代码:
try
{
SQLConn.sqL = "SELECT * FROM tblinformation WHERE " + search + " LIKE '" + strSearch + "%'";
SQLConn.ConnDB();
SQLConn.cmd = new MySqlCommand(SQLConn.sqL, SQLConn.conn);
SQLConn.dr = SQLConn.cmd.ExecuteReader();
ListViewItem x = null;
listView2.Items.Clear();
while (SQLConn.dr.Read() == true)
{
x = new ListViewItem(SQLConn.dr["AttendanceNo"].ToString());
x.SubItems.Add(SQLConn.dr["RFIDNo"].ToString());
x.SubItems.Add(SQLConn.dr["IDNumber"].ToString());
x.SubItems.Add(SQLConn.dr["FullName"].ToString());
x.SubItems.Add(SQLConn.dr["Designation"].ToString());
x.SubItems.Add(DateTime.Parse(SQLConn.dr["TimeIn"].ToString()).ToShortTimeString());
x.SubItems.Add(DateTime.Parse(SQLConn.dr["TimeOut"].ToString()).ToShortTimeString());
x.SubItems.Add(SQLConn.dr["VPlateNo"].ToString());
listView2.Items.Add(x);
}
}
catch (Exception ex)
{
Interaction.MsgBox(ex.ToString());
}
finally
{
SQLConn.cmd.Dispose();
SQLConn.conn.Close();
}
答案 0 :(得分:3)
ADO.Net的MySql提供程序将MySql Timestamp列作为.Net DateTime对象检索。您不想再次致电SQLConn.dr["TimeIn"].ToString()
时,特别是 呼叫Parse()
。阅读器字段中的对象已经是 日期时间值,因此您可以执行以下操作:
x.SubItems.Add( ((DateTime)SQLConn.dr["TimeIn"]).ToShortTimeString() );
这将更好地执行 ,并且不容易出错。我不是100%肯定会解决问题,但肯定会简化调试,尤其是将它分成两行时就这样:
DateTime temp = (DateTime)SQLConn.dr["TimeIn"];
x.SubItems.Add( temp.ToShortTimeString() );
现在,您可以在第一行上放置一个断点,并在调试器中检查实际值。
当我在这里的时候,我不能说足够强烈:
SQLConn.sqL = "SELECT * FROM tblinformation WHERE " + search + " LIKE '" + strSearch + "%'";
这是一种代码,您可以在六个月前的一个早晨发现他们。
不要这样做。
您需要查询参数,例如:
SQLConn.cmd = new MySqlCommand("SELECT * FROM tblinformation WHERE column LIKE @search + '%';", SQLConn.conn);
SQLConn.Parameters.Add("@search", MySqlDbType.VarChar, 50).Value = strSearch;
甚至仅内部应用程序也需要以这种方式工作。另外,它还可以更快地执行,并且可以解决许多DateTime和数字格式问题,因为您可以使用本地.Net类型作为参数值。
答案 1 :(得分:2)
MySQL服务器允许存储一个无效的DATETIME
值0000-00-00 00:00:00
(只要未设置NO_ZERO_DATE
server mode即可)。
由于这不是有效的.NET DateTime
值,因此需要在连接字符串中添加AllowZeroDateTime=true
,这将导致Connector / NET返回所有DATETIME
列作为特殊的MySqlDateTime
类型。
或者,如果您仍然想使用.NET的DateTime
结构而不是MySqlDateTime
,则可以在连接字符串中指定ConvertZeroDateTime=true
,它将0000-00-00 00:00:00
转换为{ {1}}从数据库中检索时。
但是,您应该仔细检查所有数据库插入代码,以确保您没有插入MySQL Server静默转换为DateTime.MinValue
的无效日期/时间值。您还应尽可能使用0000-00-00
模式,以免造成静默数据丢失。