过滤表名 & 拼接字符串

/// <summary>
        /// 分析sql语句中的表名
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns>表名</returns>
        public string AnalyseTableName(string sql)
        {
            string tblname = "";
            try
            {
                Regex reg = new Regex(@"(?in)\b(INTO|FROM|Update)\b(?![^\[\]]*\])\s+(?<table>\[[^\[\]]+\]|\S+)");
                MatchCollection mc = reg.Matches(sql);
                foreach (Match m in mc)
                {
                    tblname = m.Groups["table"].Value.Replace("[", "").Replace("]", "");

                    if (m.Groups["table"].Value.Contains("("))
                    {
                        tblname = m.Groups["table"].Value.Substring(0, m.Groups["table"].Value.IndexOf("("));
                    }
                    else
                    {
                        tblname = m.Groups["table"].Value;
                    }
                }
            }
            catch (Exception ex)
            {
                if (UseLog())
                {
                    log.Error(ex.Message.ToString());
                }
                return "";
            }
            finally
            {
                this.Close();
            }
            return tblname;
        }
//分析管理员增删改操作
        public void RecordOperation(string sql, SqlParameter[] parms, string BaseMsg)
        {
            string UserId = "";
            string UserName = "";
            string UserType = "";

            #region 判断操作人身份
            if (Session["SysAccountID"] != null)//大后台系统管理员
            {
                UserId = Session["SysAccountID"].ToString();
                UserName = Session["SysAccountName"].ToString();
                UserType = "1";
            }
            else if (Session["UserRight"] != null)
            {
                string UserRight = Session["UserRight"].ToString();

                if (UserRight[0].ToString() == "1")  //单位初始化用户
                {
                    UserId = Session["DepartID"].ToString();
                    UserName = GetDepartName(Session["DepartID"].ToString());
                    UserType = "2";
                }
                else if (UserRight[1].ToString() == "1") //系统管理员
                {
                    UserId = Session["UserID"].ToString();
                    UserName = Session["UserName"].ToString();
                    UserType = "3";
                }
            }
            #endregion

            if (UserName.Length > 0)
            {
                string DetailMsg = UserName;
                //BaseMsg不为空表示直接传入操作日志,不需要再分析
                if (BaseMsg != "")
                {
                    DetailMsg += BaseMsg;
                    InsertRecord(UserId, UserName, DetailMsg, UserType);
                }
                else
                {
                    //需要查询数据库分析sql来确定操作日志内容
                    string tblname = AnalyseTableName(sql.Trim());
                    DataTable dt = GetRecordingMsg(tblname, sql.Trim().Substring(0, 6));
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        BaseMsg = dt.Rows[0]["BaseMsg"].ToString();
                        string ColumnName = dt.Rows[0]["ColumnName"].ToString();
                        string ColumnValue = "";
                        if (ColumnName != null && ColumnName != "")
                        {
                            //如果当前是删除操作
                            if (sql.Trim().Substring(0, 6).ToLower() == "delete")
                            {
                                //查出delete语句中where子句的起始位置
                                int strIndex = sql.ToLower().LastIndexOf("where", sql.Length, sql.Length);
                                //拼接寻找主要信息的sql
                                string tempsql = " select " + ColumnName + " From " + tblname + " " + sql.Substring(strIndex, sql.Length - strIndex);
                                ColumnValue = db.QueryValue(tempsql, parms);
                            }
                            else
                            {
                                //插入或更新操作
                                foreach (SqlParameter p in parms)
                                {
                                    if (p.ParameterName.ToLower() == "@" + ColumnName.ToLower())
                                    {
                                        ColumnValue = p.Value.ToString();
                                        break;
                                    }
                                }
                            }
                        }
                        DetailMsg += BaseMsg.Replace("<detail>", ColumnValue); //替换当前更新记录的重点信息
                        #region 插入操作日志
                        InsertRecord(UserId, UserName, DetailMsg, UserType);
                        #endregion
                    }
                }
            }

        }
时间: 2024-08-28 23:15:20

过滤表名 & 拼接字符串的相关文章

正则表达式提取string 中的表名

简单版本: Regex reg = new Regex(@"(?i)\bfrom\b(?![^\[\]]*\])\s+(\[[^\[\]]+\]|\S+)"); MatchCollection mc = reg.Matches(yourStr); foreach (Match m in mc) { richTextBox2.Text += m.Groups[1].Value + "\n"; } 支持过滤join,left join等复杂联表过滤表名 Regex re

【mysql】存储过程,查询指定数据库、具体编码类型含有某字符串的所有表名和列名

1.需求:就是想在一个数据库中查找存在某字符串的表和列: 2.例子,我这里my_test数据库有3张表,test_replace的name.password列有张三字符串,t1表的name.city列也有张三字符串,t_user表就没有张三字符串. 运行结果 t1,name;t1,city;test_replace,name;test_replace,password 符合要求 3.代码 -- 1.将mysql分隔符从;设置为& DELIMITER & -- 2.如果存在存储过程getCo

MySQL 拼接表名递归寻找子节点和父节点

BEGIN declare lev int; -- 查询父级 set lev=1; drop table if exists tmp1; CREATE TABLE tmp1(ID VARCHAR(40),Wl_Code varchar(50),ParentCode varchar(40) ,levv INT); -- 用拼接的方式拼接表名和参数 SET @sqlcmd = CONCAT('INSERT tmp1 SELECT ID,Wl_Code,ParentCode,1 FROM ',tabl

mysql拼接字符串和过滤字符的方法

数据 id                value 1        aa<p>QL实木颗粒</p> 2        bb<p>QL实木颗粒</p> 3        cc<p>QL实木颗粒</p> 1.拼接字符串 ##拼接字符串 update `z_biao` set `value` = CONCAT("前面添加字符串",`value`,"中间添加字符串", `value`, "

AutoCAD.Net/C#.Net QQ群:193522571 LinQ 已知字段名的字符串如何从一个表中取得这个字符串对应字段的所有记录

代码如下: 其中cbFace.Text为字段名,TableFace为表名 var PnFace = (from n in TableFace select n.GetType().GetProperty(cbFace.Text).GetValue(n, null)); 如果需要将获取的结果进行强制转换可以在select后的字段前加上转换语句 var PnFace = (from n in TableFace select (double)n.GetType().GetProperty(cbFac

必须知道的sql编写技巧。多条件查询不拼接字符串&#183;的写法

在做项目中,我们经常遇到复杂的查询方法,要根据用户的输入,判断某个参数是否合法,合法的话才能当作过滤条件,我们通常的做法是把查询SQL赋值给一个字符串变量,然后根据判断条件动态的拼接where条件进行查询.下面来简单说一下写SQL中遇到的问题和解决办法.  一.不确定字段名,而产生的SQL字符串拼接 比如,有个公司要做一个系统,要支持多语言,这个时候我们就要将语音信息存储在数据库中.然后,根据客户选择查询对应的语言字段,进行显示.下面我们来模拟这个场景,打开SQL Server,新建SysLan

SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL,动态列字段: 方法三:使用PIVOT关系运算符,静态列字段: 方法四:使用PIVOT关系运算符,动态列字段: 扩展阅读一:参数化表名.分组列.行转列字段.字段值: 扩展阅读二:在前面的基础上加入条件过滤: 参考文献(References) 二.背景(Contexts) 其实行转列并不是一个什么新鲜的

MySQL 动态sql语句执行 用时间做表名

1. 描述 在使用数据的时候,我时候我们需要很多数据库,而且想用时间来做表名以区分.但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比如,有一个表我们想以"2015-07-16 12:00:00"命名. 2. 解决方案 如果只是更换一个普通的表名的话,很简单,直接使用下面sql语句即可: alter table old_table_name rename new_table_name 但是要以时间为表名,动态命名的话就不可以了.首先我们可以用NOW()函数获取系统当前的时

组合查询——拼接字符串

首先,什么情况下要用到组合查询呢?总的来说,有两种情况:一是在单个查询中从不同的表返回类似结构的数据:二是对单个表执行多个查询,按单个查询返回数据.在这里,我们说的组合查询是指第二种情况,即要查询的表是固定的,查询条件是不定的并且有多个查询条件. 从例子来看, 例如,输入相应的查询条件 1.教师不等于"0" 2.机器号等于"yang" 两个条件是"与"的关系,我们可以很容易的写出它的sql语句 select * from T_Worklog_In