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