C# 如何获取两条记录之间经过的时间?

C# 如何获取两条记录之间经过的时间?,c#,sql,winforms,timer,C#,Sql,Winforms,Timer,我正在使用下面的代码生成活动用户窗口标题,保存此信息以及进程名称、应用程序启动时间和持续时间。 我的问题是,当我运行代码而不是在窗口标题更改时保存窗口标题的数据时,它会每秒钟保存一次它应该保存的数据,但是我设置的条件没有被应用。我做错了什么 private void GetTotalTimer() { DateTime now = DateTime.Now; IntPtr hwnd = APIFunc.getforegroundW

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

 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";

        }
这是我的结果

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

您有以下代码:

 if (appltitle != reader.ToString())
…除非您有一个名为System.Data.SqlClient.SqlDataReader的应用程序,否则它永远不会计算为true,因为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
     }                  
 }
i、 e.您需要使用read从阅读器中实际读取,然后检查[Window Title]列的内容