Menyesuaikan CommandTimeout di Dapper.NET?

92

Saya mencoba menjalankan backup SQL melalui prosedur yang tersimpan melalui Dapper (sisa aplikasi saya menggunakan Dapper jadi saya lebih memilih untuk tetap menjalankan bagian ini melalui itu juga). Ini berfungsi dengan baik sampai CommandTimeout dijalankan.

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

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

Satu-satunya pengaturan CommandTimeout yang saya tahu ada di SqlCommand. Apakah ada cara untuk mengatur ini melalui Dapper?

sh-beta
sumber
1
Untuk alasan apa pun, saya tidak dapat menjawab pertanyaan saya sendiri sekarang. Tapi tampaknya hanya menambahkan argumen bernama "commandTimeout: 0" ke c.Execute () menangani ini.
sh-beta

Jawaban:

106

Ya, ada beberapa versi dari fungsi Execute. Satu (atau lebih) di antaranya berisi parameter commandTimeout:

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

Diambil dari SqlMapper.cs

jzacharuk.dll
sumber
4
Saya memiliki masalah yang sama, tetapi dengan metode Query, namun solusinya juga berfungsi untuk itu, karena memiliki parameter commandTimeout juga.
jahu
2
@DrSchizo mengapa tidak digunakan, tidak ada alasan untuk Async Menunggu untuk menghindari Time out
Mrinal Kamboj
1
@DrSchizo Dokumen mengatakan ini tidak digunakan dengan metode asinkron seperti BeginExecuteReader, bukan async / await. Saya berasumsi ini karena jika Anda menggunakan BeginExecuteReader, diasumsikan Anda akan menggunakan logika batas waktu Anda sendiri.
jugg1es
3
Apakah mungkin menyetel waktu tunggu ini untuk semua kueri? Saya mencoba dengan SqlConnection.ConnectionTimeout Propertytetapi dikatakan bahwa itu hanya baca. Saya akan membutuhkannya untuk beberapa program migrasi ubahsuaian. Membosankan untuk mengetiknya dengan setiap pernyataan.
Tadej
5
@jedatkinports SqlMapper.Settings.CommandTimeout Saya yakin itulah yang Anda cari.
Shiv
59

Contoh dari pertanyaan asli dengan jawaban yang diterima ditambahkan, jika ada yang menginginkannya. (Batas waktu disetel ke 60 detik):

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);
}
Adrian Carr
sumber
6

Tidak perlu menyetel waktu tunggu perintah untuk semua kueri / Panggilan Db. Anda dapat mengatur secara global seperti di bawah ini.

Dapper.SqlMapper.Settings.CommandTimeout = 0;

Anda dapat menginisialisasi properti statis ini pada pemuatan aplikasi atau dalam konstruktor kelas database.

Ini membantu dalam menghapus duplikasi, dan jika Anda memutuskan untuk mengubahnya nanti, Anda mengubahnya sekali.

Mozart Al Khateeb
sumber
0

Saya dapat memecahkan masalah saya menggunakan koneksi.Query mengatur batas waktu secara langsung

int timeOutInSeconds = 60;
.
.
.
result = conn.Query<list>(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();
Amanda Mata
sumber