การปรับ CommandTimeout ใน Dapper.NET?


92

ฉันกำลังพยายามเรียกใช้การสำรองข้อมูล SQL ผ่านขั้นตอนที่เก็บไว้ผ่าน Dapper (แอปที่เหลือของฉันใช้ Dapper ดังนั้นฉันจึงต้องการให้ส่วนนี้ทำงานต่อไปด้วย) ใช้งานได้ดีจนกระทั่ง CommandTimeout เริ่มต้น

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

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

การตั้งค่า CommandTimeout เดียวที่ฉันรู้คือใน SqlCommand มีวิธีตั้งค่าผ่าน Dapper หรือไม่?


1
ไม่ว่าด้วยเหตุผลใดตอนนี้ฉันยังตอบคำถามของตัวเองไม่ได้ แต่ดูเหมือนว่าการเพิ่มอาร์กิวเมนต์ที่มีชื่อ "commandTimeout: 0" ใน c.Execute () ก็ดูแลสิ่งนี้
sh-beta

คำตอบ:


106

ใช่มีฟังก์ชัน Execute หลายเวอร์ชัน หนึ่ง (หรือมากกว่า) มีพารามิเตอร์ commandTimeout:

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

นำมาจากSqlMapper.cs


4
ฉันมีปัญหาเดียวกัน แต่ด้วยเมธอด Query อย่างไรก็ตามวิธีแก้ปัญหาก็ใช้ได้เช่นกันเนื่องจากมีพารามิเตอร์ commandTimeout ด้วย
jahu

2
@DrSchizo ทำไมจะไม่ใช้ไม่มีเหตุผลที่ Async Await จะหลีกเลี่ยง Time out
Mrinal Kamboj

1
@DrSchizo เอกสารบอกว่าไม่ได้ใช้กับวิธีการแบบอะซิงโครนัสเช่น BeginExecuteReader ไม่ใช่ async / await ฉันคิดว่านี่เป็นเพราะถ้าคุณใช้ BeginExecuteReader จะถือว่าคุณใช้ตรรกะการหมดเวลาของคุณเอง
jugg1es

3
เป็นไปได้ไหมที่จะตั้งค่าระยะหมดเวลานี้สำหรับข้อความค้นหาทั้งหมด ฉันลองใช้SqlConnection.ConnectionTimeout Propertyแต่มันบอกว่าอ่านอย่างเดียว ฉันต้องการมันสำหรับโปรแกรมการย้ายข้อมูลที่กำหนดเอง มันน่าเบื่อที่จะพิมพ์ทุกคำสั่ง
ธ เดช

5
@jedatkinports SqlMapper.Settings.CommandTimeout ฉันเชื่อว่าเป็นสิ่งที่คุณเป็น
ชีฟ

59

ตัวอย่างจากคำถามเดิมที่เพิ่มคำตอบที่ยอมรับในกรณีที่ใครต้องการ (หมดเวลาตั้งไว้ที่ 60 วินาที):

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

ไม่จำเป็นต้องตั้งค่าการหมดเวลาของคำสั่งสำหรับการสืบค้น / การเรียก Db ทั้งหมด คุณสามารถตั้งค่าได้ทั่วโลกเช่นด้านล่าง

Dapper.SqlMapper.Settings.CommandTimeout = 0;

คุณสามารถเตรียมใช้งานคุณสมบัติแบบคงที่นี้บนโหลดแอ็พพลิเคชันหรือในตัวสร้างคลาสฐานข้อมูล

ซึ่งจะช่วยในการลบการทำซ้ำและในกรณีที่คุณตัดสินใจที่จะเปลี่ยนแปลงในภายหลังคุณสามารถเปลี่ยนได้ครั้งเดียว


0

ฉันสามารถแก้ปัญหาของฉันได้โดยใช้การเชื่อมต่อการสอบถามการตั้งค่าระยะหมดเวลาโดยตรง

int timeOutInSeconds = 60;
.
.
.
result = conn.Query<list>(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.