C#时间戳零值can';I don’我的阅读器里没有书
我在获取更新的时间戳值时遇到问题,该值返回C#时间戳零值can';I don’我的阅读器里没有书,c#,mysql,C#,Mysql,我在获取更新的时间戳值时遇到问题,该值返回0000-00-00 00:00:00。我的读卡器无法读取数据,它给出了一个错误,错误是无效的日期时间 我只想获取TimeIn和TimeOut字段下的时间 这是我的代码: try { SQLConn.sqL = "SELECT * FROM tblinformation WHERE " + search + " LIKE '" + strSearch + "%'"; SQLConn.ConnDB(); SQLConn.cmd =
0000-00-00 00:00:00
。我的读卡器无法读取数据,它给出了一个错误,错误是无效的日期时间
我只想获取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();
}
用于ADO.Net的MySql提供程序将MySql时间戳列检索为.Net日期时间对象。您不想调用
SQLConn.dr[“TimeIn”].ToString()
,尤其是当您要再次尝试Parse()
时。reader字段中的对象已经是DateTime值,因此您可以执行以下操作:
x.SubItems.Add( ((DateTime)SQLConn.dr["TimeIn"]).ToShortTimeString() );
这将更好地执行,并且更不容易出错。我不能百分之百肯定它会解决问题中的问题,但它肯定会使调试更容易,特别是如果您将它分成两行,如下所示:
DateTime temp = (DateTime)SQLConn.dr["TimeIn"];
x.SubItems.Add( temp.ToShortTimeString() );
SQLConn.cmd = new MySqlCommand("SELECT * FROM tblinformation WHERE column LIKE @search + '%';", SQLConn.conn);
SQLConn.Parameters.Add("@search", MySqlDbType.VarChar, 50).Value = strSearch;
现在,您可以在第一行上放置断点,并在调试器中检查实际值
当我在这里时,我不能说这是多么糟糕:
SQLConn.sqL = "SELECT * FROM tblinformation WHERE " + search + " LIKE '" + strSearch + "%'";
这就是你在六个月前的一天早上发现自己被黑客攻击的代码。不要这样做。 您需要查询参数,如下所示:
DateTime temp = (DateTime)SQLConn.dr["TimeIn"];
x.SubItems.Add( temp.ToShortTimeString() );
SQLConn.cmd = new MySqlCommand("SELECT * FROM tblinformation WHERE column LIKE @search + '%';", SQLConn.conn);
SQLConn.Parameters.Add("@search", MySqlDbType.VarChar, 50).Value = strSearch;
即使是仅限内部的应用程序也需要以这种方式工作。另外,它的执行速度更快,并有助于解决许多日期时间和数字格式问题,因为您使用的是原生.Net类型的参数值。MySQL服务器允许存储“无效的”DateTime
value0000-00-00 00:00:00
(只要未设置)
由于这不是有效的.NETDateTime
值,您需要将AllowZeroDateTime=true
添加到连接字符串中,这将导致Connector/NET将所有DateTime
列作为特殊的MySqlDateTime
类型返回
或者,如果仍要使用.NET的DateTime
结构而不是MySqlDateTime
,则可以在连接字符串中指定ConvertZeroDateTime=true
,从数据库检索时,该字符串将0000-00-00 00:00:00
转换为DateTime.MinValue
但是,您应该仔细检查所有数据库插入代码,以确保没有插入MySQL服务器正在悄悄转换为
0000-00-00
的无效日期/时间值。如果可能的话,您还应该使用STRICT
模式,以避免无提示的数据丢失。SQL字段是什么数据类型?我使用TIMESTAMPGah,SQL注入孔,它会烧死我们!我可以将其转换为字符串并从中获取零值吗?与此错误相同的问题是无法将MySql日期/时间值转换为System.DateTime谢谢您在我的代码中建议我。。非常感谢!谢谢看起来布拉德利的答案已经找到了真正的问题所在。你应该接受这一点。但我也有同样的错误,不要介意ToSortTimeString()我想要的是从更新的timestampYes中获取值,即使返回的默认值是0000-00-00:00:00,Bradley Grainger的回答解释了为什么。。。您的MySql数据库的旧配置违反了此处的SQL标准,因此允许使用ADO.Net提供程序默认情况下不知道如何正确转换的无效数据。您需要修改连接字符串来告诉它要做什么,正如该答案中所解释的。请按照@JoelCoehoorn的建议(在他的答案中)改进SQL查询参数化和读取值。