我需要专门捕获SQL server超时异常,以便以不同的方式处理它们.我知道我可以捕获SqlException,然后判断消息字符串是否包含"Timeout",但我想知道是否有更好的方法来实现它?

try
{
    //some code
}
catch (SqlException ex)
{

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}

推荐答案

要判断超时,我相信您需要判断ex.Number的值.如果是-2,则会出现超时情况.

是从-2\f25 DBNETLIB-2\f6(SQL Server的-2\f25 MDAC-2\f6驱动程序)返回的超时错误代码.这可以通过下载Reflector并在System.Data.SqlClient.TdsEnums下查找TIMEOUT_EXPIRED来看到.

你的代码是:

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");
    }
}

.net相关问答推荐

我的Azure应用服务从哪里获取应用设置?

在 Inno Setup 中判断给定服务的依赖服务

如何确定计时器是否正在运行?

Unity 2.0:如何使用 Resolve 和 ResolverOverride?

异步总是 WaitingForActivation

使用 Task.Factory.StartNew 传递方法参数

Silverlight 与 Flex

防止对话框在按钮的单击事件处理程序中关闭

使文本框不可编辑

从 Web.Config 中的邮箱友好显示名称存储 Smtp

如何正确停止BackgroundWorker

C#:获得完整的桌面大小?

如何结合 ||条件语句中的运算符

在 C# 中将字符串转换为十六进制字符串

资源(.resx)文件有什么好处?

如何使用 C# 创建自签名证书?

用 double 替换 int 时的 Visual Studio 长编译

判断 .NET 中的目录和文件写入权限

名称 <...> 不存在于命名空间 clr-namespace <...>

SqlParameter 已被另一个 SqlParameterCollection 包含 - using() {} 作弊吗?