2013-03-12 26 views
6

Khi sử dụng IDbConnection.ExecuteSql làm cách nào để đặt Thời gian chờ lệnh?ServiceStack OrmLite Lệnh hết giờ

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

Nếu tôi sử dụng IDbCommand.ExecuteSql (Xem bên dưới) phương pháp tôi có thể thiết lập các lệnh Timeout, nhưng tôi nhận được một loạt các cảnh báo về các phương pháp phản đối.

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

Trả lời

3

Với sự thay đổi gần đây nhất, OrmLite không còn cung cấp API trực tiếp trên IDbCommand đối tượng (đã được cài đặt bên trong phiên bản mới nhất).

Nhưng kể từ OrmLite là chỉ phương pháp khuyến nông trên ADO.NET của tiềm ẩn IDbConnectionIDbCommand giao diện, bạn có thể dễ dàng theo vượt qua phương pháp khuyến nông OrmLite khi bạn cần và chỉ sử dụng chúng trực tiếp, ví dụ:

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

Ngoài bạn có thể đặt một CommandTimeout toàn cục với:

OrmLiteConfig.CommandTimeout = 240; 
+2

Điều gì sẽ xảy ra nếu chúng tôi muốn sử dụng sql được tạo bởi db.Select. Khi chúng tôi muốn đặt thời gian chờ, chúng tôi nên sử dụng các truy vấn sql viết tay tùy chỉnh? @mythz – mustafasturan

+0

@mustafasturan, có cùng một vấn đề ... Tôi sử dụng 'IDbConnection.Query <>' và tôi cần phải xác định thời gian chờ của * đó *. –

+0

Đây có phải là giải pháp tốt nhất không? Nó có vẻ như nếu bạn đặt tham số CommandTimeout trên chuỗi kết nối mà tất cả các lệnh được tạo bằng cách sử dụng kết nối đó nên sử dụng thời gian chờ được cung cấp. Có khả năng nào của hành vi này đang thay đổi không? – on3al

4

Một chút muộn cho bữa tiệc và như bạn đã thấy trong nhận xét của mình, tôi đã gặp phải vấn đề chính xác này. Giải pháp của tôi là mở rộng đề xuất của huyền thoại và tạo phương pháp mở rộng mới:

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 
Các vấn đề liên quan