Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#时间戳零值can';I don’我的阅读器里没有书_C#_Mysql - Fatal编程技术网

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
value
0000-00-00 00:00:00
(只要未设置)

由于这不是有效的.NET
DateTime
值,您需要将
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查询参数化和读取值。