2013-03-12 16 views
6

Podczas korzystania z obiektu IDbConnection.ExecuteSql w jaki sposób ustawić limit czasu polecenia?Limit czasu komendy OrlLite ServiceStack

IDbConnection db = ConnectionFactory.OpenDbConnection(); 
db.ExecuteSql("..."); 

Jeśli używam IDbCommand.ExecuteSql (patrz poniżej) Metoda mogę ustawić limit czasu polecenia, ale mam kilka ostrzeżeń o przestarzałych metod.

IDbCommand comm = db.CreateCommand() 
comm.CommandTimeout = 240;      
comm.ExecuteSql("...");

Odpowiedz

3

Z ostatniej zmiany OrmLite nie dostarcza API wokół obiektu IDbCommand bezpośrednio (które teraz wszystko zostało wykonane wewnętrzny w najnowszej wersji).

Ale ponieważ OrmLite jest tylko rozszerzenie metod ponad bazowych IDbConnection i IDbCommand interfejsów ADO.NET jest, można łatwo obejść metody rozszerzenie OrmLite kiedy trzeba i po prostu korzystać z nich bezpośrednio, np:

IDbConnection db = ConnectionFactory.OpenDbConnection(); 
IDbCommand cmd = db.CreateCommand(); 
cmd.CommandTimeout = 240; 
cmd.CommandText = "..."; 
cmd.ExecuteNonQuery(); 

Alternatywnie można ustawić globalną CommandTimeout z:

OrmLiteConfig.CommandTimeout = 240; 
+2

Co jeśli chcemy użyć sql generowanego przez db.Select. Kiedy chcemy ustawić limit czasu, powinniśmy używać niestandardowych odręcznych zapytań SQL? @mythz – mustafasturan

+0

@mustafasturan, mając ten sam problem ... Używam 'IDbConnection.Query <>' i muszę określić limit czasu * to *. –

+0

Czy to nadal najlepsze rozwiązanie? Wygląda na to, że jeśli ustawisz parametr CommandTimeout na ciągu połączenia, wszystkie polecenia utworzone przy użyciu tego połączenia powinny korzystać z podanego limitu czasu. Czy istnieje możliwość zmiany tego zachowania? – on3al

4

trochę późno na imprezę i jak widzieliście w moim komentarzu, miałem dokładnie ten problem. Moim rozwiązaniem było rozszerzenie na sugestię mitu i utworzenie nowej metody rozszerzenia:

public static partial class IDbConnectionExtensionMethods 
{ 
    public static List<T> Query<T>(this IDbConnection self, string sql, int commandTimeout) 
    { 
     List<T> results = null; 
     self.Exec((dbCmd) => 
      { 
       dbCmd.CommandTimeout = commandTimeout; 
       dbCmd.CommandText = sql; 
       using (var reader = dbCmd.ExecuteReader()) 
       { 
        results = reader.ConvertToList<T>(); 
       } 
      }); 

     return results; 
    } // eo Query<T> 
} // eo class IDbConnectionExtensionMethods