如何在sql存储过程中打log_教你如何记录Entity Framework框架自动生成的SQL语句
有两种方法可以记录执行的SQl语句:
· 使用DbContext.Database.Log属性
· 实现IDbCommandInterceptor接口
1使用DbContext.Database.Log属性
下面截图显示了Database属性和Log属性,可以看出这个属性是一个委托,类型为Action
对Log属性的解释为:
Set this property to log the SQL generated by the System.Data.Entity.DbContext to the given delegate. For example, to log to the console, set this property to System.Console.Write(System.String).
使用方法
1)在自定义上下文中获得执行的SQL相关信息,即在自定上下文的构造函数中使用Database.Log
/// /// 自定义上下文 /// [DbConfigurationType(typeof(MySqlEFConfiguration))] public class CustomDbContext : DbContext { public CustomDbContext() : base("name=Master") { //this.Configuration.LazyLoadingEnabled = false; //new DropCreateDatabaseIfModelChanges() //new DropCreateDatabaseAlways() Database.SetInitializer(null); this.Database.Log = Log; } public DbSet Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); EntityConfiguration.Set(modelBuilder); } private void Log(string cmd) { //或输出到控制台 //Console.Write(cmd); //或输出到文件 //using (StreamWriter sw = new StreamWriter(@"E:EFCmdLogger.txt")) //{ // sw.WriteLine(cmd); //} //或输出到调试信息窗口 Debug.WriteLine(cmd); }}
执行结果如下截图
2)在具体的方法中使用
public class EFOPerations { //单线程 public static void ReadUser() { Stopwatch stw = new Stopwatch(); stw.Start(); using (CustomDbContext db = new CustomDbContext()) { db.Database.Log = Console.WriteLine; User user = db.Users.Find(1); var userDTO = new { Account = user.Account }; } stw.Stop(); var time = stw.ElapsedMilliseconds; }}
注意
db.Database.Log = Console.WriteLine;
这条语句的位置,如果将其放到查询语句,即User user = db.Users.Find(1);之后则无法输出信息!
改变日志的格式:
创建继承自DatabaseLogFormatter的类,实现新的格式化器,然后使用
System.Data.Entity.DbConfiguration.SetDatabaseLogFormatter(System.Func,System.Data.Entity.Infrastructure.Interception.DatabaseLogFormatter>)
DatabaseLogFormatter的三个方法
- LogCommand:在SQL 语句或存储过程执行前记录它。
- LogParameter:记录参数,默认被LogCommand调用(未能验证这一点)
- LogResult:记录SQL 语句或存储过程执行后的一些相关信息
这三个方法包含的参数为:
- DbCommand command:SQL 语句或存储过程相关的信息。
- DbCommandInterceptionContext interceptionContext:执行结果相关的信息。
- DbParameter parameter:System.Data.Common.DbCommand 的参数。
重写LogCommand或LogResult都可以改变SQL 语句或存储过程相关信息格式,但是注意这两个方法interceptionContext参数的值可能会不一样。
继承DatabaseLogFormatter,实现自定义格式化器
public class CustomDatabaseLogFormatter : DatabaseLogFormatter { public CustomDatabaseLogFormatter(DbContext context, Action writeAction) : base(context, writeAction) { } public override void LogCommand(DbCommand command, DbCommandInterceptionContext interceptionContext) { } public override void LogResult(DbCommand command, DbCommandInterceptionContext interceptionContext) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < command.Parameters.Count; i++) { sb.AppendLine(string.Format("参数名称:{0},值:{1}
如何在sql存储过程中打log_教你如何记录Entity Framework框架自动生成的SQL语句相关推荐
- oracle存储过程日志打印,如何在oracle存储过程中逐行打印
我正在执行一个存储过程,但它在某个时候失败了, 当前错误代码不帮我找到错误的位置和确切位置 我想知道它正在失败,所以想要在执行时逐行输出. 例如:如何在oracle存储过程中逐行打印 create o ...
- 在SQL存储过程中给条件变量加上单引号
在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @wher ...
- Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题
在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp{[Key]public Guid No { get; set; }public int ...
- 自动生成卡密SQL脚本(转载)
Comments - 446 自动生成卡密SQL脚本(转载) Code if exists (select * from dbo.sysobjects where id = object_id(N'[ ...
- 如何在sql存储过程中打log_SQL语句优化
如何定位并优化慢查询 SQL?大致思路如下: 根据慢查询日志定位慢查询 SQL: 使用 explain 等工具分析 SQL: 修改 SQL 或者尽量让 SQL 走索引. 获取有性能问题的 SQL 的 ...
- SQL存储过程中QUOTED_IDENTIFIER和ANSI_NULLS
SET ANSI_NULLS: 当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT ...
- sql存储过程中分隔字符串
最近遇到了如下问题,要向用户角色信息表中插入数据. 每个用户有多个角色,因此每次添加用户要添加一到多条记录. 这个过程要放到存储过程中实现,但是存储过程不能传入集合. 解决思路是,将角色Id集合转成用 ...
- mysql 存储过程 条件_如何在MySQL存储过程中正确实现条件?
要在存储过程中设置条件,请使用以下语法-if yourCondition then yourStatement1; else yourStatement2'; end if ; end // 让我们实 ...
- SQL Server2008 用编写脚本自动生成的Sql语言出现 “列名显示无效 ”错误
在SQLServer2008中,当设计(修改)表结构之后,再用SQL语句时,列名会显示无效. 原因SQL Server的intellisense功能,在界面用快捷键Ctrl+Shift+R更新即可 关 ...
最新文章
- php 中memcache的应用场景,php当中的memcache应用
- 提升注意力模块性能dcanet
- IDEA中安装MyBatis Log Plugin插件完整显示执行的mybatis的sql语句
- iOS Xcode4.2代码管理工具的使用
- MySQL 数据类型和 Java 数据类型对照表
- 解决Mac10.13 Pod报错 -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.fram
- 2007 Office System Beta2 Technical Refresh 下载
- python爬app视频_python爬取抖音APP视频教程
- 安装包 — 夜神模拟器下载地址
- 传智播客 GIL(全局解释器锁)学习
- QT与Coin3D实现机器人的仿真
- 解决XeLaTex编译后中文出现乱码的问题
- 密码技术学习(8.1)-数字证书简介
- 检查php语法错误,PHP检查语法错误技巧
- 祝贺父亲节快乐的python代码_2019祝爸爸父亲节快乐的最新父亲节祝福说说句子大全...
- 朋友圈爱心拼图php源码_朋友圈爱心形配图怎么弄 微信朋友圈九宫格心形拼图教程方法...
- UVM中p_sequencer和m_sequencer的用法及其区别
- 学习批处理之安装一键装机必备软件
- adobe imageready怎么扣图
- ESP32 开发笔记(四)littleVGL LVGL 控件学习 Arc 弧形控件