2013-03-12 167 views
6

當使用IDbConnection.ExecuteSql時,我該如何設置命令超時?ServiceStack OrmLite命令超時

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

如果我使用IDbCommand.ExecuteSql(見下文)方法我可以設置命令超時,但我得到了一堆關於過時方法的警告。

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

回答

3

與最近的變化OrmLite不再直接提供圍繞IDbCommand對象的API(它現在所有已成爲內部的最新版本)。

但由於OrmLite僅僅是在ADO.NET的底層IDbConnectionIDbCommand接口擴展方法,你可以很容易地繞過OrmLite的擴展方法,當你需要,只是直接使用它們,例如:

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

或者晚

OrmLiteConfig.CommandTimeout = 240; 
+2

如果我們想使用db.Select生成的sql怎麼辦?當我們想設置超時時間時,我們應該使用自定義手寫SQL查詢? @mythz – mustafasturan 2013-05-13 08:33:01

+0

@mustafasturan,有同樣的問題...我使用'IDbConnection.Query <>',我需要指定*的*超時。 – 2013-07-17 08:42:49

+0

這仍然是最好的解決方案嗎?看起來好像在連接字符串上設置CommandTimeout參數,所有使用該dbconnection創建的命令都應該使用提供的超時值。有沒有可能改變這種行爲? – on3al 2017-04-04 20:56:23

4

有點黨和你在我的評論看到,我有這個確切的問題:你可以設置一個全球性的CommandTimeout用。我的解決方案是擴展神話的建議,並創建一個新的擴展方法:

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