2013-03-12 165 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