我的独立博客网址是:http://wuyouqiang.sinaapp.com/。
我的新浪微博:http://weibo.com/freshairbrucewoo。
欢迎大家相互交流,共同提高技术。
本篇文章主要介绍本系统中的日志管理功能,由前面介绍的内容可以知道日志分为三类:分别是用户操作日志、数据表更新日志以及数据库监控日志,这些日志的写入可能遍布整个系统中的各个地方。这里提供一个统一的日志管理界面,可以对日志进行查询和删除,并没有提供修改的功能,因为日志是系统自动生成的,修改日志没有任何意义,而且还可能造成系统的漏洞,比如谁删除了数据然后把删除的日志记录修改了,就不能正确发现谁删除了数据!
1.定义操作数据集的相关成员变量,对于所有日志都采用数据集来维护,这就要求每一个表都必须要有一个主键,这样做的目的简化操作,采用一致性的模型处理所有日志数据。
1 private OracleCommandBuilder builder;//数据适配器的命令 2 private OracleDataAdapter da;//数据适配器 3 private DataSet ds; 4 protected OracleConnection Connection;
2.初始化数据库连接字符串
1 public LogManager() 2 { 3 InitializeComponent(); 4 Connection = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]); 5 }
3.初始化数据集适配器,并默认并对操作日志表,修改datagridView的列头部显示
1 /// <summary> 2 /// 初始化数据集适配器,并默认并对操作日志表,修改datagridView的列头部显示 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void LogManager_Load(object sender, EventArgs e) 7 { 8 SqlHelper sh = new SqlHelper(); 9 string sql = "select opttime,type,username,description from optlog"; 10 if (Connection.State != ConnectionState.Open) 11 { 12 Connection.Open(); 13 } 14 //构建数据适配器为了修改数据,绑定的数据表必须有主键才能修改 15 da = new OracleDataAdapter(sql, Connection); 16 builder = new OracleCommandBuilder(da); 17 ds = new DataSet(); 18 da.Fill(ds, "jcsjk_optlog"); 19 dataGridViewX1.DataSource = ds.Tables[0]; 20 21 dataGridViewX1.Columns[0].HeaderText = "时间"; 22 dataGridViewX1.Columns[1].HeaderText = "类型"; 23 dataGridViewX1.Columns[2].HeaderText = "用户名"; 24 dataGridViewX1.Columns[3].HeaderText = "日志内容"; 25 dataGridViewX1.Columns[3].Width = 300; 26 27 comboBoxEx1.SelectedIndex = 0; 28 }
4.导出数据到word或excel中,具体的导出过程在前面的工具类中已经介绍过了。
1 /// <summary> 2 /// 导出数据到word或excel 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void expLogBtn_Click(object sender, EventArgs e) 7 { 8 FrmSelectExpType fset = new FrmSelectExpType(); 9 fset.ShowDialog(); 10 11 if (fset.isGon) 12 { 13 if (fset.type == 0) 14 { 15 CommonTools.ExportDataGridViewToWord(dataGridViewX1); 16 } 17 else 18 { 19 CommonTools.DataToExcel(dataGridViewX1); 20 MessageBox.Show("导出数据完成!"); 21 } 22 } 23 }
5.删除一条日志记录的实现
1 /// <summary> 2 /// 删除一条日志记录 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void delOneBtn_Click(object sender, EventArgs e) 7 { 8 if (dataGridViewX1.CurrentRow.Index < 0) 9 { 10 MessageBox.Show("请选择需要删除的一行"); 11 return; 12 } 13 14 string strTime = dataGridViewX1.Rows[dataGridViewX1.CurrentRow.Index].Cells[0].Value.ToString(); 15 dataGridViewX1.Rows.Remove(dataGridViewX1.CurrentRow); 16 17 if (da.Update(ds, "optlog") > 0) 18 { 19 errLabel.Text = "删除一条日志记录成功!"; 20 } 21 else 22 { 23 errLabel.Text = "删除一条日志记录失败!"; 24 } 25 }
6.根据选择字段类型来查询日志,可以根据操作时间、日志类型、用户名或日志的具体内容。
1 /// <summary> 2 /// 查询相关日志 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void queryBtn_Click(object sender, EventArgs e) 7 { 8 //dataGridViewX1.Rows.Clear(); 9 string strType = string.Empty; 10 11 switch (comboBoxEx1.SelectedIndex) 12 { 13 case 0: 14 strType = "OPTTIME"; 15 break; 16 case 1: 17 strType = "TYPE"; 18 break; 19 case 2: 20 strType = "USERNAME"; 21 break; 22 case 3: 23 strType = "description"; 24 break; 25 default: 26 break; 27 } 28 string sql = string.Empty; 29 30 SqlHelper sh = new SqlHelper(); 31 sql = "select opttime,type,username,description from optlog where " + 32 strType + " like '%" + queryTxt.Text.Trim() + "%'"; 33 if (Connection.State != ConnectionState.Open) 34 { 35 Connection.Open(); 36 } 37 //构建数据适配器为了修改数据,绑定的数据表必须有主键才能修改 38 da = new OracleDataAdapter(sql, Connection); 39 builder = new OracleCommandBuilder(da); 40 ds = new DataSet(); 41 da.Fill(ds, "jcsjk_optlog"); 42 dataGridViewX1.DataSource = ds.Tables[0]; 43 44 dataGridViewX1.Columns[0].HeaderText = "时间"; 45 dataGridViewX1.Columns[1].HeaderText = "类型"; 46 dataGridViewX1.Columns[2].HeaderText = "用户名"; 47 dataGridViewX1.Columns[3].HeaderText = "日志内容"; 48 dataGridViewX1.Columns[3].Width = 300; 49 }
7.删除所有日志。
1 private void delAllBtn_Click(object sender, EventArgs e) 2 { 3 //dataGridViewX1.Rows.Clear(); 4 int count = dataGridViewX1.Rows.Count; 5 for (int i = count-1; i >= 0; --i ) 6 { 7 dataGridViewX1.Rows.RemoveAt(i); 8 if (da.Update(ds, "optlog") > 0) 9 { 10 continue; 11 } 12 else 13 { 14 errLabel.Text = "删除日志记录失败!"; 15 } 16 } 17 errLabel.Text = "删除日志记录成功!"; 18 }
8.总结
本篇文章介绍的日志管理功能相对比较简单,没有什么技术难度,不过我觉得还是有几点可以值得思考和学习。第一采用统一的数据管理模型,而不是一张数据表就需要一个单独界面来管理;第二日志查询采用了一种称为全文查询,只要涉及的字段都纳入可查询范围,而且都是通过同一条sql语句实现,通过用户选择的来配置,当然可以增强一些功能就是允许用户选择多个字段;第三就是删除日志也采用了灵活的方式,可以选择一条删除,如果要删除多条(有规律的日志:例如某一天的),可以通过查询然后使用删除所有日志功能(这里是指查询出来在控件中显示的日志)。
OK!今天介绍完毕!
|
请发表评论