2010-11-22 16 views
1

我試圖在Listview上編寫作業監視器,我從msdb數據庫中的sysjobsysjobhistory表中獲取信息。我如何知道列表視圖中的工作時間?我如何知道在列表視圖(SQL Server 2000)上發生作業

我不明白run_time列。我想顯示在頂行的最後一份工作,並在圖中所示,當工作出現時間顯示 (我有2個工作蕨菜同)

alt text

形式sysjobhistory顯示數字代碼,我不知道它意思是如70000,71000 ... 但我想顯示時間爲上午11點,上午10點...如圖所示。

我想連續顯示信息,按照時間表重複監視JOB。

public void GetJobsAndStatus() 
    { 
     string sqlJobQuery = "select j.job_id, j.name, j.enabled, jh.run_status, jh.message, jh.run_date, jh.step_name, jh.run_time from sysjobs j inner join sysjobhistory jh on j.job_id = jh.job_id"; 

     // create SQL connection and set up SQL Command for query 
     using (SqlConnection _con = new SqlConnection("server=10.15.13.70;database=msdb;user id=sa;pwd=")) 
     using (SqlCommand _cmd = new SqlCommand(sqlJobQuery, _con)) 
     { 
      try 
      { 
       // open connection 
       _con.Open(); 


       // create SQL Data Reader and grab data 
       using (SqlDataReader rdr = _cmd.ExecuteReader()) 
       { 
        // as long as we get information from the reader 
        while (rdr.Read()) 
        { 
         Guid jobID = rdr.GetGuid(0);  // read Job_id 
         string jobName = rdr.GetString(1); // read Job name 
         byte jobEnabled = rdr.GetByte(2); // read Job enabled flag 
         int jobStatus = rdr.GetInt32(3); // read run_state from jobhistory 
         string jobMessage = rdr.GetString(4); 
         int jobRunDate = rdr.GetInt32(5); 
         string jobStepName = rdr.GetString(6); 
         int jobRunTime = rdr.GetInt32(7); 

         String[] lviData = new String[] 
     { 
      jobID.ToString(), 
      jobName.ToString(), 
      jobStepName.ToString(), 
      jobMessage.ToString(), 
      jobStatus.ToString(), 
      jobRunDate.ToString(), 
      jobRunTime.ToString(), 

     }; 
      ListViewItem lvi = new ListViewItem(lviData); 
      listView1.Items.Add(lvi); 

       } 

        rdr.Close(); 
       } 
      } 
      catch (Exception e) 
      { 

       MessageBox.Show(e.Message); 
      } 
      // close connection again 
      _con.Close(); 

      // return _jobs; 
     } 
    } 

結果未達到線的排列等預期。

alt text

請建議該怎麼辦。(用MS Visual Studio 2008中(C#))謝謝。

並感謝您的過去幫助。

回答

1

我不明白你的問題是什麼,坦率地說......

看看你最後的屏幕截圖的第一行:

Run_Date = 20101122 

前4位是年份(2010),接下來的兩個月(11 = 11月),最後兩天(22)。

如果你看一下運行時間:

Run_Time = 112001 

前兩位是小時(11),接下來的兩分鐘(20),最後兩秒(01)。

所以這份工作是在2010年11月22日11:20:01上次運行的。

獲取此信息是一個非常簡單的字符串解析和操作。

那麼是什麼原因導致你的問題?你在哪裏「封鎖」,不要進入下一步?

+0

哦,所以對不起,我混淆了一件小事。 – Fernatit 2010-11-22 07:31:46

+0

好吧,我真的很困惑我的項目,但現在我知道了一些字符串解析已經。當我單擊按鈕調用GetJobsAndStatus()時,形成此代碼結果是Fern和TestJob(最後一個屏幕快照)is'n排序與企業管理器中顯示的相同。我該怎麼做? – Fernatit 2010-11-22 09:02:53

+1

是的,好 - 這是你從那個查詢中得到的輸出 - 你想從這個輸出中獲得什麼?不清楚你到底想要什麼...... – 2010-11-22 09:13:24

0

我有客戶端上的應用程序通過ODBC從SQL Server獲取工作信息。

是否有可能,如果我使用計時器獲取工作信息每1秒,並顯示在列表視圖上的工作信息。 *我想要的一切都是實時的*

怎麼辦?

private void button1_Click_1(object sender, EventArgs e) 
    { 

      timer1.Enabled = true; 

    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     listView1.Items.Clear(); 
     GetJobsAndStatus(); 
    } 
0

繼續前面的。

我可以在datagridview上做到這一點,比使用listview。我通過使用子字符串檢查查找作業是否失敗,並檢查作業的上次運行日期和上次運行時間。

public void DisplayList() 
     { 

       bool check = true; // true = use oldData 

       if ((oldData[0] != newData[0]) || ((oldData[0] == newData[0]) && (oldData[6] != newData[6]))) 
       { 
        check = false; // false = use newData 
       } 

       if (!check) 
       { 
        string mgs = newData[3]; 

        if (mgs.Substring(8, 1) == "f") 
        { 
         for (int j = 0; j < newData.Length; j++) 
         { 
          oldData[j] = newData[j]; 
         } 

         for (int i = 0; i < IDList.Items.Count; i++) 
         { 
          if (oldData[0] == IDList.Items[i].ToString().ToLower()) 
          { 
           dataGridView1.Rows.Add(oldData); 
           SmsRtb.Text = "The job name is : " + oldData[1] + '\n' + "message: " + oldData[3] + '\n' + "Date: " + oldData[5] + '\n' + "Time: " + oldData[6]; 

           //SendSMS(); 

          } 
         } 

        } 
       } 
     }