You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:27:20