在使用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;
}
}
CommandTimeout
的值。