.net对各表的操作详细到字段的更改记录的日志

存入数据库中,目前的字段包括操作人,操作时间,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(0, 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 - 1, ‘)‘);
            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(0, 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 - 1, 1);
            consb.Append(" where ");
            foreach (DictionaryEntry de in keytable)
            {
                consb.Append(de.Key + "=‘" + de.Value + "‘" + " and ");
            }
            consb.Remove(consb.Length - 4, 3); //去掉"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。其实完全可以利用反射找出各个对象的属性和值,再一一比较,方法能够更加抽象出来,这 个等以后再说

时间: 2024-08-18 03:39:14

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

sql增加字段记录丢失 sql数据表丢列 软件增加字段后之前记录丢失

客户名称 某大型企业 数据类型 SQL2005数据库 数据大小 10g 故障现象 数据库其中一个表 被客户把text字段类型改成了varchar类型,导致表数据部分丢失.后客户又改成text类型. 处理结果 客户把文件发给我们后,首先分析造成此次数据丢失的原因,text类型的字段存储的文本内容可以跨页,改成varchar类型就会导致超过长度的值都无法保存在新的varchar类型字段,这样一来就会导致很多超过此长度的数据丢失/.. 根据日志分析 客户先后把这个text字段改成了 varchar(2

oracle表的操作简述

单表的操作!(代码完全可以用手工代替,写下来为了记忆)1.建立表create table HKB_TABLE_MODIFY(  NAME VARCHAR2(6),  AGE  VARCHAR2(3),  SEX  VARCHAR2(2)) 2.修改表添加字段:alter table HKB_TABLE_MODIFY add ADDRESS nvarchar2(3);删除字段:alter table HKB_TABLE_MODIFY drop column SEX;修改字段属性:alter tab

Mysql之表的操作与索引操作

表的操作: 1.表的创建: create table if not exists table_name(字段定义); 例子: create table if not exists user(id int auto_increment, uname varchar(20), address varchar(200), updateTime datetime, primary key(id)); // 设置主键 2.表(show tables;)定义查看: show create table tab

Mysql --库和表的操作

库的增删改查 系统数据库 创建数据库 数据库的相关操作 表的操作 存储引擎介绍(有点多 很啰唆) 表的介绍 表的操作 一.系统数据库 查看系统库: show databases; nformation_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件.锁等现象mysql: 授权库,主要存储

06-Mysql数据库----表的操作

本节掌握 存储引擎介绍(了解) 表的增删改查 一.存储引擎(了解) 前几节我们知道mysql中建立的库===>文件夹,库中的表====>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎. ps: 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因

MySQL表的操作01

表在数据库中主要用来实现存储数据记录,其基本操作包括创建表.查看表.删除表和修改表. 表中的数据库对象包括: 1.列(COLUMNS):也称属性列,在具体创建表时,必须指定列的名字和它的数据类型. 2.索引(INDEXES):根据指定的数据库建立起来的顺序,提供了快速访问数据的途径. 3.触发器(TRIGGERS):指用户定义的事务命令集合,当对一个表中的数据进行插入.或删除时这组命令就会自动执行,可以用来确保数据的完整性和安全性. *******************************

库的操作&amp;表的操作

一 库的操作 掌握库的增删改查 一.系统数据库 执行如下命令,查看系统库 show databases; information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件.锁等现象mysql: 授权库,主要存储系统用户的权限信息test: MySQL数据库系统自动创建的测试数据库

MySQL学习3 - 数据表的操作

本节掌握 一.存储引擎(了解) 二.mysql支持的存储引擎 1.InnoDB 存储引擎 2.MyISAM 存储引擎 3.NDB 存储引擎 4.Memory 存储引擎 5.Infobright 存储引擎 6.NTSE 存储引擎 7.BLACKHOLE 8.指定表类型/存储引擎 三.表介绍 四.创建表 本节掌握 存储引擎介绍(了解) 表的增删改查 一.存储引擎(了解) 前几节我们知道mysql中建立的库=>文件夹,库中的表=>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各

数据库----mysql 表的操作

mysql 表的操作 一,存储引擎 数据的存储方式 -- 存储引擎engines 使用不同的存储引擎,数据是以不同的方式存储的 show engines------------查看存储引擎 不同的储存引擎及适用场景 innodb 用于事务处理应用程序,支持外键和行级锁.如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的.InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整