• .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。其实完全可以利用反射找出各个对象的属性和值,再一一比较,方法能够更加抽象出来,这 个等以后再说

  • 相关阅读:
    Host IP地址 is not allowed to connect to this MySQL server
    本地或远程连接mysql:Unable to connect to any of the specified MySQL hosts.
    Table xxx is marked as crashed and should be repaired
    使用Linq 做数据去重
    SharePoint2010与Reporting Services集成方案
    上下左右布局(DIV+CSS)
    .NET 内存管理—CLR的工作
    删除数据库所有用户表
    未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序
    c# 10位数int时间单位换算为datetime
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/4472559.html
Copyright © 2020-2023  润新知