企业库 5.0 和命令超时

本文关键字:命令 超时 企业库 | 更新日期: 2023-09-27 17:56:34

我正在使用以下代码,想知道如果使用企业库的CreateSprocAccessor,我们是否需要设置命令超时,如果不是,那么超时是如何管理的?

var accessor = _sqlDatabase.CreateSprocAccessor<xyz>("uspGetxyz", 
                     new xyzParameters(_sqlDatabase),
                     MapBuilder<xyz>.MapAllProperties().Build());
//Execute the accessor to obtain the results
var Data = accessor.Execute();
xyzList = Data.ToList<xyz>();

企业库 5.0 和命令超时

我很久以前就开始使用企业库Microsoft在正常情况下,使用提供的"数据库"类方法的数据库操作调用可以满足需求。在某些情况下,对于长时间运行的查询,开发人员希望设置 SqlCommand(或 DbCommand)类的 CommandTimeout 属性。这将允许查询作为命令超时中设置的值长时间执行。

默认情况下,数据访问应用程序块不支持/采用方法调用中的简单 CommandTimeout 参数(网络上有许多解决方法示例)。为了以最小的更改实现相同的目的,我添加了一个名为"WithCommandTimeOut"的简单函数,该函数在"Microsoft.Practices.EnterpriseLibrary.Data.Database"类中获取timeOutSecond参数,该参数返回"Database"类的相同实例。有关代码更改,请参阅下面的更新代码片段。希望这将解决超时问题。

//Class Level Static Variables
//Used to reset to default after assigning in "PrepareCommand" static method
static int DEFAULT_COMMAND_TIMEOUT_RESET = 30;
//Default value when "WithCommandTimeOut" not called
static int COMMAND_TIMEOUT_FOR_THIS_CALL = DEFAULT_COMMAND_TIMEOUT_RESET; 
public Database WithCommandTimeOut(int timeOutSeconds)
{
    COMMAND_TIMEOUT_FOR_THIS_CALL = timeOutSeconds;
    return this;
}
protected static void PrepareCommand(DbCommand command, DbConnection connection)
{
    if (command == null) throw new ArgumentNullException("command");
    if (connection == null) throw new ArgumentNullException("connection");
    //Here is the magical code ----------------------------
    command.CommandTimeout = COMMAND_TIMEOUT_FOR_THIS_CALL;
    //Here is the magical code ----------------------------
    command.Connection = connection;
    //Resetting value to default as this is static and subsequent
    //db calls should work with default timeout i.e. 30
    COMMAND_TIMEOUT_FOR_THIS_CALL = DEFAULT_COMMAND_TIMEOUT_RESET;
}

前任。 Database db = EnterpriseLibraryContainer.Current.GetInstance(Of Database)("SmartSoftware"); .db。WithCommandTimeOut(0).ExecuteDataSet(CommandType.Text, query);

我不敢相信企业库团队犯了什么错误,他们没有提供任何在访问器的情况下设置命令超时的方法,这是一个已知的问题http://entlib.codeplex.com/workitem/28586不敢相信,我已经开发了整个项目,只是知道这是一个已知的问题:-(WTF

我们可以在连接字符串中更新它,增加连接超时 = 1000;

您可以在

AssignParameters方法中修改xyzParameters类中的DbCommand超时:

public void AssignParameters(
  System.Data.Common.DbCommand command, object[] parameterValues)
  {
    command.CommandTimeout = 0;
    ...
  }

Volla!! 我对企业库的源代码进行了更改,在 Sproc 访问器类中添加了一个新的"执行"方法,该方法将占用 TimeOut 参数,并在我的项目中使用这些二进制文件