本篇文章主要介紹本系統中的日誌管理功能,由前面介紹的內容可以知道日誌分爲三類:分別是用戶操作日誌、數據表更新日誌以及數據庫監控日誌,這些日誌的寫入可能遍佈整個系統中的各個地方。這裏提供一個統一的日誌管理界面,可以對日誌進行查詢和刪除,並沒有提供修改的功能,因爲日誌是系統自動生成的,修改日誌沒有任何意義,而且還可能造成系統的漏洞,比如誰刪除了數據然後把刪除的日誌記錄修改了,就不能正確發現誰刪除了數據!
1.定義操作數據集的相關成員變量,對於所有日誌都採用數據集來維護,這就要求每一個表都必須要有一個主鍵,這樣做的目的簡化操作,採用一致性的模型處理所有日誌數據。
- private OracleCommandBuilder builder;//數據適配器的命令
- private OracleDataAdapter da;//數據適配器
- private DataSet ds;
- protected OracleConnection Connection;
2.初始化數據庫連接字符串
- public LogManager()
- {
- InitializeComponent();
- Connection = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
- }
3.初始化數據集適配器,並默認並對操作日誌表,修改datagridView的列頭部顯示
- /// <summary>
- /// 初始化數據集適配器,並默認並對操作日誌表,修改datagridView的列頭部顯示
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void LogManager_Load(object sender, EventArgs e)
- {
- SqlHelper sh = new SqlHelper();
- string sql = "select opttime,type,username,description from optlog";
- if (Connection.State != ConnectionState.Open)
- {
- Connection.Open();
- }
- //構建數據適配器爲了修改數據,綁定的數據表必須有主鍵才能修改
- da = new OracleDataAdapter(sql, Connection);
- builder = new OracleCommandBuilder(da);
- ds = new DataSet();
- da.Fill(ds, "jcsjk_optlog");
- dataGridViewX1.DataSource = ds.Tables[0];
- dataGridViewX1.Columns[0].HeaderText = "時間";
- dataGridViewX1.Columns[1].HeaderText = "類型";
- dataGridViewX1.Columns[2].HeaderText = "用戶名";
- dataGridViewX1.Columns[3].HeaderText = "日誌內容";
- dataGridViewX1.Columns[3].Width = 300;
- comboBoxEx1.SelectedIndex = 0;
- }
4.導出數據到word或excel中,具體的導出過程在前面的工具類中已經介紹過了。
- /// <summary>
- /// 導出數據到word或excel
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void expLogBtn_Click(object sender, EventArgs e)
- {
- FrmSelectExpType fset = new FrmSelectExpType();
- fset.ShowDialog();
- if (fset.isGon)
- {
- if (fset.type == 0)
- {
- CommonTools.ExportDataGridViewToWord(dataGridViewX1);
- }
- else
- {
- CommonTools.DataToExcel(dataGridViewX1);
- MessageBox.Show("導出數據完成!");
- }
- }
- }
5.刪除一條日誌記錄的實現
- /// <summary>
- /// 刪除一條日誌記錄
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void delOneBtn_Click(object sender, EventArgs e)
- {
- if (dataGridViewX1.CurrentRow.Index < 0)
- {
- MessageBox.Show("請選擇需要刪除的一行");
- return;
- }
- string strTime = dataGridViewX1.Rows[dataGridViewX1.CurrentRow.Index].Cells[0].Value.ToString();
- dataGridViewX1.Rows.Remove(dataGridViewX1.CurrentRow);
- if (da.Update(ds, "optlog") > 0)
- {
- errLabel.Text = "刪除一條日誌記錄成功!";
- }
- else
- {
- errLabel.Text = "刪除一條日誌記錄失敗!";
- }
- }
6.根據選擇字段類型來查詢日誌,可以根據操作時間、日誌類型、用戶名或日誌的具體內容。
- /// <summary>
- /// 查詢相關日誌
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void queryBtn_Click(object sender, EventArgs e)
- {
- //dataGridViewX1.Rows.Clear();
- string strType = string.Empty;
- switch (comboBoxEx1.SelectedIndex)
- {
- case 0:
- strType = "OPTTIME";
- break;
- case 1:
- strType = "TYPE";
- break;
- case 2:
- strType = "USERNAME";
- break;
- case 3:
- strType = "description";
- break;
- default:
- break;
- }
- string sql = string.Empty;
- SqlHelper sh = new SqlHelper();
- sql = "select opttime,type,username,description from optlog where " +
- strType + " like '%" + queryTxt.Text.Trim() + "%'";
- if (Connection.State != ConnectionState.Open)
- {
- Connection.Open();
- }
- //構建數據適配器爲了修改數據,綁定的數據表必須有主鍵才能修改
- da = new OracleDataAdapter(sql, Connection);
- builder = new OracleCommandBuilder(da);
- ds = new DataSet();
- da.Fill(ds, "jcsjk_optlog");
- dataGridViewX1.DataSource = ds.Tables[0];
- dataGridViewX1.Columns[0].HeaderText = "時間";
- dataGridViewX1.Columns[1].HeaderText = "類型";
- dataGridViewX1.Columns[2].HeaderText = "用戶名";
- dataGridViewX1.Columns[3].HeaderText = "日誌內容";
- dataGridViewX1.Columns[3].Width = 300;
- }
7.刪除所有日誌。
- private void delAllBtn_Click(object sender, EventArgs e)
- {
- //dataGridViewX1.Rows.Clear();
- int count = dataGridViewX1.Rows.Count;
- for (int i = count-1; i >= 0; --i )
- {
- dataGridViewX1.Rows.RemoveAt(i);
- if (da.Update(ds, "optlog") > 0)
- {
- continue;
- }
- else
- {
- errLabel.Text = "刪除日誌記錄失敗!";
- }
- }
- errLabel.Text = "刪除日誌記錄成功!";
- }
8.總結
本篇文章介紹的日誌管理功能相對比較簡單,沒有什麼技術難度,不過我覺得還是有幾點可以值得思考和學習。第一採用統一的數據管理模型,而不是一張數據表就需要一個單獨界面來管理;第二日誌查詢採用了一種稱爲全文查詢,只要涉及的字段都納入可查詢範圍,而且都是通過同一條sql語句實現,通過用戶選擇的來配置,當然可以增強一些功能就是允許用戶選擇多個字段;第三就是刪除日誌也採用了靈活的方式,可以選擇一條刪除,如果要刪除多條(有規律的日誌:例如某一天的),可以通過查詢然後使用刪除所有日誌功能(這裏是指查詢出來在控件中顯示的日誌)。
OK!今天介紹完畢!