我需要特别捕捉 SQL 服务器超时异常,以便以不同的方式处理它们。我知道我可以捕获 SqlException,然后检查消息字符串是否包含“ Timeout”,但是我想知道是否有更好的方法来做到这一点?
try { //some code } catch (SqlException ex) { if (ex.Message.Contains("Timeout")) { //handle timeout } else { throw; } }
SqlException.ErrorCode 属性的值是多少? 可以使用它吗?
当有超时时,可能值得检查 -2146232060的代码。
我会在数据代码中将其设置为静态常量。
要检查超时,我相信您需要检查 ex 的值。号码。如果是 -2,则出现超时情况。
-2是超时的错误代码,从 DBNETLIB 返回,这是 SQL Server 的 MDAC 驱动程序。这可以通过下载 反光镜和查看 System 来看到。百科。SqlClient.TIMEOUT _ EXPIRED 的 TdsEnums。
你的代码应该是:
if (ex.Number == -2) { //handle timeout }
证明失败的代码:
try { SqlConnection sql = new SqlConnection(@"Network Library=DBMSSOCN;Data Source=YourServer,1433;Initial Catalog=YourDB;Integrated Security=SSPI;"); sql.Open(); SqlCommand cmd = sql.CreateCommand(); cmd.CommandText = "DECLARE @i int WHILE EXISTS (SELECT 1 from sysobjects) BEGIN SELECT @i = 1 END"; cmd.ExecuteNonQuery(); // This line will timeout. cmd.Dispose(); sql.Close(); } catch (SqlException ex) { if (ex.Number == -2) { Console.WriteLine ("Timeout occurred"); } }
这里: http://www.tech-archive. net/archive/dotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html rel = “ norefrer”> http://www.tech-archive.net/archive/dotnet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html 你也可以看到 托马斯 · 温加特纳写道: < br >
Timeout: SqlException. Number = = -2(这是 ADO.NET 错误代码) 一般网络错误: SqlException. Number = = 11 死锁: SqlException. Number = = 1205(这是 SQLServer 错误代码)
...
我们也将“一般网络错误”作为超时异常处理。只有在极少数情况下才会出现这种情况,例如,当您的更新/插入/删除查询将引发长时间运行的触发器时。
更新 c # 6:
try { // some code } catch (SqlException ex) when (ex.Number == -2) // -2 is a sql timeout { // handle timeout }
非常简单,看起来不错! !
我不确定,但当我们执行超时或命令超时时 客户机向 SQLServer 发送一个“ ABORT”,然后简单地放弃查询处理。不回滚任何事务,也不释放任何锁。为了解决这个问题,我在存储过程中删除事务,并在。管理 sqlException
当客户端发送 ABORT 时,不会回滚任何事务。为了避免这种行为,我们必须使用 SET _ XACT _ ABORT ON Https://learn.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15