如何捕获SQLServer超时exception
我需要专门捕获SQL Server超时exception,以便可以以不同方式处理它们。 我知道我可以捕获SqlException,然后检查消息string是否包含“超时”,但想知道是否有更好的方法来做到这一点?
try { //some code } catch (SqlException ex) { if (ex.Message.Contains("Timeout")) { //handle timeout } else { throw; } }
要检查超时,我相信你检查ex.Number的值。 如果是-2,那么你有一个超时的情况。
-2是从SQL Server的MDAC驱动程序DBNETLIB返回的超时错误代码。 这可以通过下载Reflector ,查看TIMEOUT_EXPIRED的System.Data.SqlClient.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
你也可以阅读Thomas Weingartner写道:
超时:SqlException.Number == -2(这是一个ADO.NET错误代码)
一般networking错误:SqlException.Number == 11
死锁:SqlException.Number == 1205(这是一个SQL Server错误代码)
…
我们也将“常规networking错误”作为超时exception处理。 它只发生在罕见的情况下,例如,当你的更新/插入/删除查询会引发长时间运行的触发器。
什么是SqlException.ErrorCode属性的值? 你能用吗?
当超时时,可能值得检查代码-2146232060 。
我会在数据代码中将其设置为静态常量。