Điều chỉnh CommandTimeout trong Dapper.NET?


92

Tôi đang cố gắng chạy các bản sao lưu SQL thông qua một thủ tục được lưu trữ thông qua Dapper (phần còn lại của ứng dụng của tôi sử dụng Dapper, vì vậy tôi cũng muốn giữ phần này chạy qua nó). Nó hoạt động tốt cho đến khi CommandTimeout khởi động.

using (var c = SqlConnection(connstring))
{
    c.Open();
    var p = new DynamicParameters();
    // fill out p

    c.Execute("xp_backup_database", p, commandType: CommandType.StoredProcedure);
}

Cài đặt CommandTimeout duy nhất mà tôi biết là trong SqlCommand. Có cách nào để thiết lập điều này thông qua Dapper không?


1
Vì lý do gì, tôi không thể trả lời câu hỏi của chính mình lúc này. Nhưng có vẻ như chỉ thêm đối số có tên "commandTimeout: 0" vào c.Execute () đã giải quyết vấn đề này.
sh-beta

Câu trả lời:


106

Có, có nhiều phiên bản của hàm Execute. Một (hoặc nhiều) trong số chúng chứa các tham số commandTimeout:

public static int Execute(this IDbConnection cnn, string sql, 
                dynamic param = null, IDbTransaction transaction = null, 
                            int? commandTimeout = null, CommandType? commandType = null)

Lấy từ SqlMapper.cs


4
Tôi đã gặp vấn đề tương tự, nhưng với phương thức Truy vấn, tuy nhiên giải pháp cũng hoạt động cho nó, vì nó cũng có tham số commandTimeout.
jahu

2
@DrSchizo tại sao nó không được sử dụng, không có lý do để chờ đợi async để tránh Time out
Mrinal Kamboj

1
@DrSchizo Các tài liệu cho biết nó không được sử dụng với các phương thức không đồng bộ như BeginExecuteReader, không phải async / await. Tôi cho rằng điều này là do nếu bạn sử dụng BeginExecuteReader, thì giả sử bạn sẽ sử dụng logic thời gian chờ của riêng mình.
jugg1es

3
Có thể đặt thời gian chờ này cho tất cả các truy vấn không? Tôi đã thử với SqlConnection.ConnectionTimeout Propertynhưng nó nói rằng nó chỉ đọc. Tôi sẽ cần nó cho một số chương trình di chuyển tùy chỉnh. Thật tẻ nhạt khi gõ nó với mọi câu lệnh.
Tadej

5
@jedatkinports SqlMapper.Settings.CommandTimeout Tôi tin rằng bạn đang theo đuổi.
Shiv

59

Ví dụ từ câu hỏi ban đầu với câu trả lời được chấp nhận được thêm vào, trong trường hợp bất kỳ ai muốn nó. (Thời gian chờ được đặt thành 60 giây):

using (var c = SqlConnection(connstring))
{
    c.Open();
    var p = new DynamicParameters();
    // fill out p

    c.Execute("xp_backup_database", p, commandTimeout: 60, 
                                       commandType: CommandType.StoredProcedure);
}

6

Không cần đặt thời gian chờ lệnh cho tất cả các truy vấn / Cuộc gọi Db. Bạn có thể đặt toàn cầu như bên dưới.

Dapper.SqlMapper.Settings.CommandTimeout = 0;

Bạn có thể khởi tạo thuộc tính tĩnh này khi tải ứng dụng hoặc trong phương thức khởi tạo lớp cơ sở dữ liệu.

Điều này giúp loại bỏ sự trùng lặp và trong trường hợp bạn quyết định thay đổi nó sau này, bạn hãy thay đổi nó một lần.


0

Tôi đã có thể giải quyết vấn đề của mình bằng cách sử dụng kết nối. Truy vấn đặt trực tiếp thời gian chờ

int timeOutInSeconds = 60;
.
.
.
result = conn.Query<list>(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.