如何在Telerik OpenAccess SQL查询报错中显示实际参数值而非问号
问题
我正在开发多个基于C#的应用,通过Telerik OpenAccess连接SQL Server数据库。当抛出异常时,生成的SQL查询中实际值被问号替代,无法知晓具体操作的参数。
源代码示例
int count = database.GetData<Order>().Where(o => (o.Status == Waiting) && o.Name == plane.Name).Count(); List<Order> OrderList = database.GetData<Order>().Where(o => o.Name == Source && (o.Status == Active || o.Status == Waiting)).ToList(); // 对象修改操作示例 OrderList.RemoveAll(...); Order.Status = Finished; // 提交修改时抛出异常 database.SaveChanges(); // commit the changes to the objects in database
异常日志示例
Telerik.OpenAccess.Exceptions.OptimisticVerificationException: Row not found: GenericOID@11e493f2 Order Id=3950 DELETE FROM [Orders] WHERE [Id] = ? Telerik.OpenAccess.Exceptions.OptimisticVerificationException: Row not found: GenericOID@39979f8d Section Id=1613 UPDATE [Locations] SET [ChangedOn] = ?, [Reservations] = ? WHERE [Id] = ? AND [ChangedOn] = ? Telerik.OpenAccess.Exceptions.DataStoreException: Insert of '1454555061-' failed: ... declare @generated_ids table([Id] bigint) insert [Alarms] ([Area], [Code], [Date], [By], [Details], [Producer], [ResolveDate] output inserted.[Id] into @generated_ids VALUES (?, ?, ?, ?, ?, ?, ?)
可以看到SQL中的问号替代了实际值,无法明确操作的具体参数。每个异常信息末尾都提示:(set event logging to all to see parameter values)。
请问该提示是什么意思?什么是事件日志?如何配置它以在SQL查询中显示实际值而非问号?
解答
1. 提示的含义
这个提示表示当前Telerik OpenAccess的日志级别仅输出带占位符(问号)的SQL框架,没有记录SQL执行时的实际参数值。将事件日志级别设置为all后,日志会完整输出SQL语句及对应的参数实际值,便于定位数据层面的问题(比如乐观锁冲突时的实际修改时间、删除操作的目标ID值等)。
2. 什么是事件日志
Telerik OpenAccess的事件日志是ORM框架内置的日志系统,用于记录数据库交互过程中的各类关键事件,包括:
- 生成的SQL语句及参数
- 异常详情与堆栈信息
- 实体对象的加载、修改、提交操作
- 数据库连接的建立与释放
- 性能统计数据(如SQL执行耗时)
它是调试ORM与数据库交互问题的核心工具,能帮助开发者直观看到框架实际执行的数据库操作细节。
3. 配置方法
有两种常用配置方式:
方式一:代码中动态配置
在初始化OpenAccess上下文的代码中,添加日志配置:
using Telerik.OpenAccess; using Telerik.OpenAccess.Logging; // 获取当前上下文的配置 var config = database.Context.Configuration; // 设置日志级别为All,开启全量日志 config.LoggingOptions.LogLevel = LogLevel.All; // 指定日志输出方式(这里以控制台输出为例) config.LoggingOptions.AddListener(new ConsoleTraceListener());
方式二:配置文件(app.config/web.config)配置
在配置文件的openaccess节点下添加日志配置:
<openaccess xmlns="http://www.telerik.com/OpenAccess"> <logging logLevel="All"> <listeners> <add type="System.Diagnostics.ConsoleTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="Console" /> <!-- 也可以配置文件日志 --> <!-- <add type="System.Diagnostics.TextWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="File" initializeData="openaccess_log.txt" /> --> </listeners> </logging> </openaccess>
配置完成后,再次触发异常时,日志会输出包含实际参数值的完整SQL,例如:
DELETE FROM [Orders] WHERE [Id] = 3950
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

