存入数据库中,目前的字段包括操作人,操作时间,sql语句,被修改的字段,字段原值,操作人的身份。

  /// <summary>
/// 添加操作日志
/// </summary>
/// <param name="strsql">执行的sql语句</param>
/// <param name="username">执行人</param>
/// <param name="dentity">执行人身份</param>
/// <param name="cmdparms">参数</param>
public static void AddLog(StringBuilder strsql,string username,string dentity,params SqlParameter[] cmdparms)
{
Graduate.Model.OperateLog model = new Graduate.Model.OperateLog();
model.dentity = dentity;
model.operatUser = username;
model.operatTime = DateTime.Now.ToString();
string content = strsql.ToString().Substring(, strsql.ToString().IndexOf("values"));
StringBuilder sblog = new StringBuilder();
sblog.Append(content + " values ");
sblog.Append(" ( ");
foreach (SqlParameter sp in cmdparms)
{
sblog.Append("'" + sp.Value + "',");
}
sblog.ToString().TrimEnd(',');
sblog.Insert(sblog.Length - , ')');
model.operatContent = sblog.ToString().TrimEnd(',');
model.PrevValue = "";
model.NewValue = "";
Graduate.DAL.OperateLog dal = new OperateLog();
dal.Add(model);
} /// <summary>
/// 删除操作日志
/// </summary>
/// <param name="strsql">sql语句</param>
/// <param name="username">执行人</param>
/// <param name="dentity">执行人身份</param>
/// <param name="id">关键字段</param>
/// <param name="hash">参数(Hasttable)</param>
public static void DeleteLog(StringBuilder strsql, string username, string dentity, string id,Hashtable hash)
{
Graduate.Model.OperateLog logmodel = new Graduate.Model.OperateLog();
logmodel.dentity = dentity;
logmodel.operatUser = username;
StringBuilder sblog = new StringBuilder();
string conten = strsql.ToString().Substring(, strsql.ToString().IndexOf('='));
sblog.Append(conten + " = ");
sblog.Append(id.ToString());
logmodel.operatContent = sblog.ToString();
logmodel.operatTime = DateTime.Now.ToString();
string prevval = "";
foreach (DictionaryEntry de in hash)
{
prevval += de.Key + "=" + de.Value + ",";
}
prevval = prevval.TrimEnd(',');
logmodel.PrevValue = prevval;
logmodel.NewValue = "";
Graduate.DAL.OperateLog logdal = new OperateLog();
logdal.Add(logmodel);
} /// <summary>
/// 更新操作日志
/// </summary>
/// <param name="obj1">原对象</param>
/// <param name="parmhash">更新字段集(Hashtable)</param>
/// <param name="username">执行人</param>
/// <param name="dentity">执行人身份</param>
/// <param name="tableName">表名</param>
/// <param name="keytable">存储条件和值(Hashtable)</param>
public static void UpdateLog(object obj1,Hashtable parmhash,string username,string dentity,string tableName,Hashtable keytable)
{
PropertyInfo[] properties = obj1.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); StringBuilder consb = new StringBuilder();
Hashtable prevhash = new Hashtable();
Hashtable newhash = new Hashtable();
consb.Append(" update " + tableName + " set ");
foreach (PropertyInfo pi in properties)
{
string piname = pi.Name;
string pivalue = Convert.ToString(pi.GetValue(obj1, null));
foreach (DictionaryEntry de in parmhash)
{
if (piname == de.Key.ToString())
{
if (pivalue != de.Value.ToString())
{
if (!keytable.Contains(de.Key))
{
consb.Append(de.Key + "='" + de.Value + "'" + ",");
}
prevhash.Add(piname, pivalue);
newhash.Add(piname, de.Value);
}
}
}
}
consb.Remove(consb.Length - , );
consb.Append(" where ");
foreach (DictionaryEntry de in keytable)
{
consb.Append(de.Key + "='" + de.Value + "'" + " and ");
}
consb.Remove(consb.Length - , ); //去掉"and "
string prevval = "";
foreach (DictionaryEntry de in prevhash)
{
prevval += de.Key + "=" + de.Value + ",";
}
prevval = prevval.TrimEnd(',');
string newval = "";
foreach (DictionaryEntry de in newhash)
{
newval += de.Key + "=" + de.Value + ",";
}
newval = newval.TrimEnd(',');
Graduate.Model.OperateLog logmodel = new Graduate.Model.OperateLog();
logmodel.dentity = dentity;
logmodel.NewValue = newval;
logmodel.operatContent = consb.ToString();
logmodel.operatTime = DateTime.Now.ToString();
logmodel.operatUser = username;
logmodel.PrevValue = prevval;
Graduate.DAL.OperateLog logdal = new OperateLog();
logdal.Add(logmodel);
}

由于使用的是sqlhelper类,所以一般sql语句类似"insert into A (field) values (@field)",如果传入了参数,sql语句并不改变,因为使用的是StringBuilder连接字符串,而我需要具体到保存入数据库的sql也能 执行的地步,所以需要做各种拼接转换工作.

有一个地方结果是正确的,我却不明白为什么.看“添加操作”的 “ model.operatContent = sblog.ToString().TrimEnd(',');”;

拼接完insert语句后,总是在后面跟了个“,”还不知道是怎么产生的。需要trimEnd去掉","才算正确,想不明白

另外一个需要说的是,之所以放在DAL层,是因为传入了"执行人"和"执行人身份"这个两个字段,那么就需要为各个类的增改删方法添加这个方法了,这个工 作量就比较大,是很不好的,主要是因为不想修改sqlhelper。其实完全可以利用反射找出各个对象的属性和值,再一一比较,方法能够更加抽象出来,这 个等以后再说

.net对各表的操作详细到字段的更改记录的日志的更多相关文章

  1. oracle表的操作简述

    单表的操作!(代码完全可以用手工代替,写下来为了记忆)1.建立表create table HKB_TABLE_MODIFY(  NAME VARCHAR2(6),  AGE  VARCHAR2(3), ...

  2. sqlite数据库操作详细介绍 增删改查,游标

    sqlite数据库操作详细介绍 增删改查,游标     本文来源于www.ifyao.com禁止转载!www.ifyao.com Source code     package com.example ...

  3. MYSQL数据库学习五 表的操作和约束

    5.1 表的基本概念 表示包含数据库中所有数据的数据库对象.一行代表唯一的记录,一列代表记录的一个字段. 列(Columns):属性列,创建表时必须指定列名和数据类型. 索引(Indexes):根据指 ...

  4. Mysql之表的操作与索引操作

    表的操作: 1.表的创建: create table if not exists table_name(字段定义); 例子: create table if not exists user(id in ...

  5. 存储引擎和表的操作(mysql中的数据类型、完整性约束)

    一.存储引擎 .概念 MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力. 通过选择不同的技术 ...

  6. MySQL学习3 - 数据表的操作

    本节掌握 一.存储引擎(了解) 二.mysql支持的存储引擎 1.InnoDB 存储引擎 2.MyISAM 存储引擎 3.NDB 存储引擎 4.Memory 存储引擎 5.Infobright 存储引 ...

  7. Mysql --库和表的操作

    库的增删改查 系统数据库 创建数据库 数据库的相关操作 表的操作 存储引擎介绍(有点多 很啰唆) 表的介绍 表的操作 一.系统数据库 查看系统库: show databases; nformation ...

  8. MySQL表的操作

    一.存储引擎(了解) 前几节我们知道mysql中建立的库===>文件夹,库中的表====>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文 ...

  9. MySql cmd下的学习笔记 —— 有关表的操作(对表中数据的增,删,改,查)

    (知识回顾) 连接数据库 mysql -uroot -p111 先建立一个新库 create database test1; use test1; 由于今天的主要内容是表的操作,建立表的详细过程不是本 ...

随机推荐

  1. hdu 4115 Eliminate the Conflict ( 2-sat )

    Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  2. lght oj 1257 - Farthest Nodes in a Tree (II) (树dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1257 跟hdu2196一样,两次dfs //#pragma comment(l ...

  3. 编译安装-MySQL5.5

    一.参数选项 1.目录选项 2.存储引擎选项 3.库文件加载选项 二.安装 1.环境准备 2.安装前的系统设置 3.安装执行 4.初始化数据库 5.注册为服务 6.加入环境变量 7.启动服务 8.重新 ...

  4. 利用一些码农Trick去搞一搞G和T的单词

    根据自然语言处理中的Zipf统计定律,在自然语言的语料库里,一个单词出现的频率与它在频率表里的排名成反比.因此,我们有理由认为,可以根据这个频率表进行一下排序,以及purning.由于精力有限,没有足 ...

  5. lighttpd fastcgi的搭建

    公司很久以前有个task需要在板子上搭建个webserver以响应局域网内手机的请求. 以前是用lighttpd plugin实现的,后来仔细想想用fast cgi来弄也可以. 在install li ...

  6. ios和android一并学习的体会

    如果说为什么要同时学习这两种不同的移动平台,其实有一定的“闲”的因素在里面. 相对于ios,android我是早半年接触的.最开始学习的时候也就是j2ee学习的延续,通过看视频连带看书学了大概一个月的 ...

  7. c++中的signal机制

    简介 signal是为了解决类之间通信的问题而出现的,更深入的原因是面向对象讲究封装,但是封装必然导致类之间沟通困难,但是使用接口的方式又太重量级--需要写很多代码,而且会导致接口爆炸 比如你需要把一 ...

  8. 使用Office-Word的博客发布功能(测试博文)

    本人打算在博客园开博,但平时收集和整理资料都在OneNote中,又不想在写博客时还要进行复制粘贴操作,于是就想到了Microsoft Office自带的博客发布功能.在此做了一下测试,发布了此博文. ...

  9. Django官方文档学习1——第一个helloworld页面

    Django 1.10官方文档:https://docs.djangoproject.com/en/1.10/intro/tutorial01/ 1.查看django版本 python -m djan ...

  10. (5)html表单

    本节解说: html的表单. form * <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. * < ...