如何获得两个记录之间的时间?

时间:2014-06-13 11:46:19

标签: c# sql winforms timer

我正在使用下面的代码生成活动用户窗口标题我保存此信息以及进程名称,应用程序启动的时间和持续时间。 我的问题是当我运行代码而不是在窗口标题更改时保存窗口标题的数据时,它会保存它应该的每一秒,但是我设置的条件没有被应用。我做错了什么。

 private void GetTotalTimer()
        {
            DateTime now = DateTime.Now;
            IntPtr hwnd = APIFunc.getforegroundWindow();
            Int32 pid = APIFunc.GetWindowProcessID(hwnd);
            Process p = Process.GetProcessById(pid);

            appName = p.ProcessName;
            const int nChars = 256;
            int handle = 0;
            StringBuilder Buff = new StringBuilder(nChars);
            handle = GetForegroundWindow();
            appltitle = APIFunc.ActiveApplTitle().Trim().Replace("\0", "");

            //if (GetWindowText(handle, Buff, nChars) > 0)
            //{
            //    string strbuff = Buff.ToString();

            //    StrWindow = strbuff;

                #region insert statement
                try
                {
                    if (Conn.State == ConnectionState.Closed)
                    {
                        Conn.Open();
                    }
                    if (Conn.State == ConnectionState.Open)
                    {
                        SqlCommand com = new SqlCommand("Select top 1 [Window Title] From TimerLogs ORDER BY [Time of Event] DESC", Conn);
                        SqlDataReader reader = com.ExecuteReader();
                        startTime = DateTime.Now;
                        string time = now.ToString();
                        if (!reader.HasRows)
                        {
                            reader.Close();


                            cmd = new SqlCommand("insert into [TimerLogs] values(@time,@appName,@appltitle,@Elapsed_Time,@userName)", Conn);
                            cmd.Parameters.AddWithValue("@time", time);
                            cmd.Parameters.AddWithValue("@appName", appName);
                            cmd.Parameters.AddWithValue("@appltitle", appltitle);
                            cmd.Parameters.AddWithValue("@Elapsed_Time", blank.ToString());
                            cmd.Parameters.AddWithValue("@userName", userName);
                            cmd.ExecuteNonQuery();
                            Conn.Close();
                        }
                        else if(reader.HasRows)
                        {
                            reader.Read();
                            if (appltitle != reader.ToString())
                            {
                                reader.Close();
                                endTime = DateTime.Now;
                                appduration = endTime.Subtract(startTime);

                                cmd = new SqlCommand("insert into [TimerLogs] values (@time,@appName,@appltitle,@Elapsed_Time,@userName)", Conn);
                                cmd.Parameters.AddWithValue("@time", time);
                                cmd.Parameters.AddWithValue("@appName", appName);
                                cmd.Parameters.AddWithValue("@appltitle", appltitle);
                                cmd.Parameters.AddWithValue("@Elapsed_Time", appduration.ToString());
                                cmd.Parameters.AddWithValue("@userName", userName);
                                cmd.ExecuteNonQuery();
                                reader.Close();
                                Conn.Close();
                            }
                        }
                    }

                }
                catch (Exception)
                {

                }
          //}

                #endregion
                ActivityTimer.Start();
                Processing = "Working";

        }

这是我的结果     enter image description here

在上面的代码中,我的逻辑就是这样。如果表中没有其他数据(如果有数据),代码将检查当前应用程序名称是否与数据库表中的应用程序名称不匹配,则代码会在应用程序作为starttime启动时记录。如果这是真的,则然后计算持续时间,但是它每秒插入数据

1 个答案:

答案 0 :(得分:0)

你有代码:

 if (appltitle != reader.ToString())

...永远不会评估为true(除非你有一个名为System.Data.SqlClient.SqlDataReader的应用程序),因为appltitle包含你的应用程序和reader的标题.ToString()只是转换一个SqlDataReader到一个字符串,字面意思是“System.Data.SqlClient.SqlDataReader”。

您需要做的是将当前appltitle与正在阅读的数据值进行比较:

 // if able to read a row
 if (reader.Read())
 {  
     int ColumnIndex = reader.GetOrdinal("[Window Title]");
     // This gets you the value of the Window Title column in the current row
     if (appltitle != reader.GetString(ColumnIndex))
     {
         // Do Stuff Here
     }                  
 }

即。您需要使用Read()实际读取阅读器,然后检查[Window Title]列的内容。