65.9K
CodeProject 正在变化。 阅读更多。
Home

更改 LINQ DataContext 的默认 CommandTimeout

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (18投票s)

2008 年 5 月 22 日

CPOL

2分钟阅读

viewsIcon

211797

本文展示了一种更改 DataContext CommandTimeout 默认值的方法。

引言

有时,执行 LINQ to SQL 查询可能需要更长的时间,并超过 DataContext 类的 CommandTimeout 属性的默认值。 以下文章将介绍一种为您的 DataContext 类实现应用程序范围内的 CommandTimeout 的方法。

问题

调用长时间运行的数据库查询/存储过程的 LINQ to SQL 代码最终会遇到 System.Data.SqlClient.SqlException:超时已过期异常。

解决方案

DataContext 类的 CommandTimeout 的默认值设置为 30 秒。 任何需要超过 30 秒才能完成的数据库查询都将抛出 System.Data.SqlClient.SqlException:超时已过期异常。

此问题的一个解决方案是在每次创建 LINQ to SQL DataContext 对象并调用此类查询之前设置 CommandTimeout 的值。 但是,这种方法的问题在于,它会引入代码重复和相关问题。

我们实际上希望能够更改 CommandTimeout 属性的默认值,并且我们希望有效地做到这一点。 幸运的是,Visual Studio 2008 自动生成的 DataContext 子类提供了一种简单的方法,可以使用通过部分方法的扩展性来实现此目标。

C# 代码

通常,自动生成的 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;
    }
}

就是这样! 这很简单,因为

  1. DataContext 类的客户端不需要关心 CommandTimeout 值,保持沉默。
  2. 更改仅在一个地方,这意味着没有代码重复。
  3. 将此方法放在部分类中的单独文件中,确保即使自动生成的类在 DBML 文件发生更改时可能被覆盖,此更改也将保留。

历史

  • 2008 年 5 月 22 日:初始发布
© . All rights reserved.