是否有办法设置超时为CreateSprocAccessor(…)在企业库5.0?
导致默认超时不适用于长存储过程。
第一件事:在连接字符串中添加超时并不能解决问题。
我找到了一个解决方法:你可以修改EL 5.0的源代码并生成一个新的自定义DLL。
- … EntLib50Src 数据块 Src Data SprocAccessor.cs 执行(…)方法
- 在return:命令之前添加这段代码。CommandTimeout = 120;//2分钟
- 编译并使用新的Microsoft.Practices.EnterpriseLibrary.Data.dll,您可以在…EntLib50SrcBlocksbinDebug中找到
实际上,我认为没有必要有你自己的EL副本。为了保持原始EL二进制文件不变,您只需执行以下操作:
- 继承自procaccessor类
- 覆盖Execute()方法,在这里放置与procaccessor .Execute()相同的代码,但增加了超时部分
- 你还需要保留一个局部变量(在你的新类中)procedureName,因为这个变量在SprocAccessor类 中是私有的
像这样:
public class SprocAccessorWithTimeout<T> : SprocAccessor<T>
{
readonly string procedureName;
public SprocAccessorWithTimeout(Database database, string procedureName, IRowMapper<T> rowMapper) : base(database, procedureName, rowMapper)
{
this.procedureName = procedureName;
}
public override IEnumerable<T> Execute(params object[] parameterValues)
{
using (var command = Database.GetStoredProcCommand(this. procedureName))
{
command.CommandTimeout = MaxSpExecutionTimeout;
if (parameterValues.Length > 0)
{
Database.AssignParameters(command, parameterValues);
}
return base.Execute(command);
}
}
}