3 Stimmen

Enterprise Library 5.0 und Befehlszeitüberschreitung

Ich verwende folgenden Code und möchte wissen, ob wir benötigen, um Befehl-Timeout zu setzen, wenn mit CreateSprocAccessor der Unternehmensbibliothek, wenn nicht dann wie Timeout verwaltet wird?

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>();

3voto

Sumit Udani Punkte 41

Ich habe begonnen, mit Microsoft Enterprise Library lange zurück, wo im Normalfall die DB-Operation Anrufe mit bereitgestellten Methoden der Klasse "Database" die Notwendigkeit erfüllen. In einigen Fällen, für die lang laufende Abfrage, Entwickler will CommandTimeout Eigenschaft der SqlCommand (oder DbCommand) Klasse gesetzt. Dadurch kann die Abfrage so lange ausgeführt werden, wie der Wert in CommandTimeout eingestellt ist.

Standardmäßig unterstützt der Data Access Application Block keine einfachen CommandTimeout-Parameter in Methodenaufrufen (es gibt viele Workaround-Beispiele im Netz). Um das Gleiche mit minimalen Änderungen zu erreichen, habe ich eine einfache Funktion mit dem Namen "WithCommandTimeOut" hinzugefügt, die den Parameter timeOutSecond in der Klasse "Microsoft.Practices.EnterpriseLibrary.Data.Database" annimmt und die gleiche Instanz der Klasse "Database" zurückgibt. Siehe aktualisiertes Codeschnipsel unten für Codeänderungen. Ich hoffe, dass damit das Timeout-Problem gelöst wird.

//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;
}

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

2voto

RX100 Punkte 509

Wir können dies in der Verbindungszeichenfolge aktualisieren, indem wir Connection Timeout=1000 erhöhen;

1voto

user1606705 Punkte 11

Sie können Folgendes ändern DbCommand Timeout in Ihrem xyzParameters Klasse in AssignParameters Methode:

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

0voto

Deepesh Punkte 4986

Volla!!! ich habe Änderungen im Quellcode der Enterprise-Bibliothek vorgenommen, eine neue "execute"-Methode hinzugefügt, die den timeOut-Parameter in der Sproc-Accessors-Klasse annimmt, und diese Binärdateien in meinem Projekt verwendet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X