过滤表名 & 拼接字符串
/// <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(, 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 = "";
}
else if (Session["UserRight"] != null)
{
string UserRight = Session["UserRight"].ToString(); if (UserRight[].ToString() == "") //单位初始化用户
{
UserId = Session["DepartID"].ToString();
UserName = GetDepartName(Session["DepartID"].ToString());
UserType = "";
}
else if (UserRight[].ToString() == "") //系统管理员
{
UserId = Session["UserID"].ToString();
UserName = Session["UserName"].ToString();
UserType = "";
}
}
#endregion if (UserName.Length > )
{
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(, ));
if (dt != null && dt.Rows.Count > )
{
BaseMsg = dt.Rows[]["BaseMsg"].ToString();
string ColumnName = dt.Rows[]["ColumnName"].ToString();
string ColumnValue = "";
if (ColumnName != null && ColumnName != "")
{
//如果当前是删除操作
if (sql.Trim().Substring(, ).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
}
}
} }
过滤表名 & 拼接字符串的更多相关文章
- 正则表达式提取string 中的表名
简单版本: Regex reg = new Regex(@"(?i)\bfrom\b(?![^\[\]]*\])\s+(\[[^\[\]]+\]|\S+)"); MatchColl ...
- oracle中字符串与表数据拼接的用法--“||”
测试过程中,经常需要批量删除或者插入.修改一些表数据或结构,使用手工复制.粘贴其实很麻烦,所以这是我们就可以使用拼接成sql语句的方法来实现操作数据.下面先讲讲oracle中拼接符 || 的用法,如下 ...
- mysql拼接字符串和过滤字符的方法
数据 id value 1 aa<p>QL实木颗粒</p> 2 bb<p>QL实木颗粒</p> ...
- 使用dao时,如何同时使用动态表名和过滤字段?
使用dao时,如何同时使用动态表名和过滤字段? 发布于 630天前 作者 wukonggg 316 次浏览 复制 上一个帖子 下一个帖子 标签: 无 如题.求样例代码 1 回复 wend ...
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...
- SQL Server 2008 R2——根据数据查找表名和字段名 根据脏数据定位表和字段
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- [BILL WEI]SQL 如何将查询到的列作为表名去查询数据
我们在做sql查询的时候,有时候需要将查询的列作为表名,去引用,然后再次查询 declare @table_name varchar(20) select @table_name=table_name ...
- MySQL 动态sql语句运行 用时间做表名
1. 描写叙述 在使用数据的时候,我时候我们须要非常多数据库,并且想用时间来做表名以区分.可是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比方,有一个表我们想以"2015-07 ...
- oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息
来源于网上整理 总结了一下oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表select * fro ...
随机推荐
- About SOuP
http://www.soup-dev.com - SOuP的强大我不必多说. - Maya 也可以开发出象houdini这样有趣的节点,这再soup之前是很难想象的.所以说soup的作者Peter的 ...
- H5摇一摇遇到的问题
一.如何对摇晃效果进行反馈 刚开始的处理方式是,摇晃过程中不做任何处理,但后来反馈说这种效果不好,好像就没有摇动一样,如果声音也不响的话,就真的和什么都没发生一样. 后来想了想,加入摇晃过程动画,就像 ...
- struts2执行流程
当Web容器收到 请求(HttpServletRequest) 1.它将请求传递给一个标准的的过滤链包括 (ActionContextCleanUp)过滤器 2.然后经过Other filters(S ...
- Flex air修改外部xml文件 (转)
AIR的文件操作不难,看完教程应该可以满足你对文件的所有基本操作.这篇教程主要以实际操作中遇到的情况来讲解 我们想想文件操作都会有什么内容,无非是创建,修改,删除,移动,拷贝.在这个过程中我们会涉及到 ...
- Python mysql 操作小类,供大家用用
import binascii import os import linecache import time #add pyDes path #sys.path.append("/data1 ...
- [DFNews] Fire-Eye与Fox IT联合推出Cryptolocker解锁网站
Cryptolocker是臭名昭著的勒索程序,使用AES加密后密钥回传,用户除了缴纳赎金之外基本无法解密数据. 近日,知名安全公司Fire-Eye与Fox IT联合推出了针对该勒索程序的解锁网站 ht ...
- XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端
XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端 源起一个App项目,Web服务器就一台,已经装了 ...
- 统计在从1到n的正整数中1出现的次数
问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数. 例如:N= 2,写下1,2.这样只出现了1个“1”. N= 12,我们会写下1, 2, 3, 4, ...
- PowerDesigner设计时表显示注释选项
PowerDesigner设计时表显示注释选项:选定编辑的表,右键- >Properties- >Columns- >Customize Columns and Filter(或直接 ...
- window.frame
定义和用法 frames 属性返回窗口中所有命名的框架. 该集合是 Window 对象的数组,每个 Window 对象在窗口中含有一个框架或 <iframe>.属性 frames.leng ...