全局设置LINQ to SQL DataContext的CommandTimeout

在使用LINQ to SQL进行数据库操作时,可能会遇到执行时间较长的查询或存储过程,这可能会导致System.Data.SqlClient.SqlException: Timeout expired Exception异常。默认情况下,DataContext类的CommandTimeout属性设置为30秒,超过这个时间未完成的查询就会抛出超时异常。为了避免这种情况,需要设置一个更长的超时时间。本文将介绍如何在Visual Studio中实现对DataContext类的全局CommandTimeout设置。

问题描述

LINQ to SQL中,如果执行的数据库查询或存储过程运行时间超过30秒,就会抛出超时异常。这在处理大量数据或复杂查询时尤为常见。为了解决这个问题,可以在每次创建LINQ to SQL DataContext对象并执行此类查询之前设置CommandTimeout的值。但这种方法会导致代码重复和相关的问题。

解决方案

幸运的是,Visual Studio 2008自动生成的DataContext子类提供了一种通过部分方法(partial methods)实现扩展性的简单方法。可以利用这一点来全局设置CommandTimeout的值。

通常,自动生成的DataContext子类会包含一些部分方法声明,例如:

#region Extensibility Method Definitions partial void OnLoaded(); partial void OnValidate(System.Data.Linq.ChangeAction action); partial void OnCreated(); // Other DataContext specific methods #endregion

感兴趣的是名为OnCreated()的方法。如果查看DataContext子类的构造函数,会发现这个方法在所有重载版本的构造函数的末尾被调用。

对于不熟悉部分方法的读者,可以参考MSDN文档。简而言之,部分方法是类中的扩展点。如果没有为部分方法提供定义(除了声明之外),那么调用将被忽略。但如果提供了实现,它将像常规方法一样被调用。

将在另一个具有与自动生成类相同全名的部分类中定义OnCreated()方法的主体,并在那里设置所需的超时值:

partial class SampleDBDataContext : System.Data.Linq.DataContext { partial void OnCreated() { // Put your desired timeout here. this.CommandTimeout = 3600; // If you do not want to hard code it, then take it // from Application Settings / AppSettings this.CommandTimeout = Settings.Default.CommandTimeout; } }

优点

  • 它非常简洁,DataContext类的客户端不需要关心CommandTimeout的值。
  • 更改只发生在一个地方,这意味着没有代码重复。
  • 将这个方法放在一个单独的文件中,即使自动生成的类在DBML文件更改时被覆盖,这个更改也会保留。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485