C#时间戳零值无法在我的阅读器中读取

时间:2018-10-19 16:20:55

标签: c# mysql

我在获取更新的时间戳值时遇到问题,该值返回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();
}

2 个答案:

答案 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服务器允许存储一个无效的DATETIME0000-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模式,以免造成静默数据丢失。