Saya perlu secara khusus menangkap pengecualian waktu tunggu server SQL sehingga mereka dapat ditangani secara berbeda. Saya tahu saya bisa menangkap SqlException dan kemudian memeriksa apakah string pesan Mengandung "Timeout" tetapi bertanya-tanya apakah ada cara yang lebih baik untuk melakukannya?
try
{
//some code
}
catch (SqlException ex)
{
if (ex.Message.Contains("Timeout"))
{
//handle timeout
}
else
{
throw;
}
}
c#
.net
sql-server
error-handling
brodie
sumber
sumber
Jawaban:
Untuk memeriksa batas waktu, saya yakin Anda memeriksa nilai ex.Number. Jika -2, maka Anda memiliki situasi batas waktu.
-2 adalah kode galat untuk batas waktu, dikembalikan dari DBNETLIB, driver MDAC untuk SQL Server. Ini dapat dilihat dengan mengunduh Reflector , dan mencari di bawah System.Data.SqlClient.TdsEnums untuk TIMEOUT_EXPIRED.
Kode Anda akan berbunyi:
Kode untuk menunjukkan kegagalan:
sumber
di sini: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html
Anda juga dapat membaca bahwa Thomas Weingartner menulis:
...
sumber
Diperbarui untuk c # 6:
Sangat sederhana dan bagus untuk dilihat !!
sumber
Apa nilai properti SqlException.ErrorCode? Bisakah Anda bekerja dengan itu?
Saat memiliki waktu tunggu, mungkin ada baiknya memeriksa kode untuk -2146232060 .
Saya akan mengatur ini sebagai konstanta statis dalam kode data Anda.
sumber
Saya tidak yakin tetapi ketika kita telah mengeksekusi waktu habis atau waktu perintah habis Klien mengirimkan "ABORT" ke SQL Server kemudian meninggalkan pemrosesan kueri. Tidak ada transaksi yang dibatalkan, tidak ada kunci yang dilepaskan. untuk mengatasi masalah ini saya Hapus transaksi di Stored-procedure dan gunakan SQL Transaction di .Net Code saya Untuk mengelola sqlException
sumber
Ketika klien mengirim ABORT, tidak ada transaksi yang dibatalkan. Untuk menghindari perilaku ini kita harus menggunakan SET_XACT_ABORT ON https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15
sumber