Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何捕获SQLServer超时异常_C#_.net_Sql Server_Error Handling - Fatal编程技术网

C# 如何捕获SQLServer超时异常

C# 如何捕获SQLServer超时异常,c#,.net,sql-server,error-handling,C#,.net,Sql Server,Error Handling,我需要专门捕获SQL server超时异常,以便以不同的方式处理它们。我知道我可以捕获SqlException,然后检查消息字符串是否包含“Timeout”,但我想知道是否有更好的方法来执行此操作 try { //some code } catch (SqlException ex) { if (ex.Message.Contains("Timeout")) { //handle timeout } else {

我需要专门捕获SQL server超时异常,以便以不同的方式处理它们。我知道我可以捕获SqlException,然后检查消息字符串是否包含“Timeout”,但我想知道是否有更好的方法来执行此操作

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

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

SqlException.ErrorCode属性的值是多少?你能用这个吗

出现超时时,可能值得检查-2146232060的代码


我会在数据代码中将其设置为静态常量。

要检查超时,我相信您会检查ex.Number的值。如果它是-2,那么您有一个超时情况

-2是超时的错误代码,由SQL Server的MDAC驱动程序DBNETLIB返回。这可以通过下载并在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");
    }
}
在这里:

你也可以读到托马斯·温加特纳写道:

超时:SqlException.Number==-2(这是ADO.NET错误代码)
一般网络错误:SqlException.Number==11
死锁:SqlException.Number==1205(这是一个SQL Server错误代码)


我们也将“常规网络错误”作为超时异常处理。它仅在极少数情况下发生,例如更新/插入/删除查询将引发长时间运行的触发器

针对c#6的更新:


非常简单和好看

我不确定,但当我们执行超时或命令超时时
客户端向SQL Server发送“中止”,然后简单地放弃查询处理。不回滚任何事务,不释放任何锁。为了解决这个问题,我删除了存储过程中的事务,并在.Net代码中使用SQL事务来管理sqlException

当客户端发送ABORT时,不会回滚任何事务。为了避免这种行为,我们必须在上使用SET_XACT_ABORT

是的,这正是我目前正在做的事情,但检查-2下载红门的反射器并搜索超时超时时间并不十分优雅。它位于System.Data.SqlClient.TdsEnums中,其值为-2:o) 对于那些无法访问Reflector的用户:@brodie这就是为什么您应该为其设置一个常量,并且您可以在对该常量的注释中解释“magic”值的来源。查看文档中的错误代码,在我看来,它似乎在报告互操作级别的错误。因此,可能更多的是COM错误,或者提供程序遇到了异常(通常),而不是与您正在执行的操作相关的特定错误。@Eric是正确的-这是SqlException类型的HRESULT代码,而不是异常源。您是在寻找ConnectionTimeout还是CommandTimeout,ie您是否希望连接失败或执行的命令失败?我正在寻找CommandTimeout,它被设置为默认值30秒,我认为它没有回答如何在c#CodeThank中捕获命令超时的问题。。。我喜欢你的建议并使用它。
    try
    {
        // some code
    }
    catch (SqlException ex) when (ex.Number == -2)  // -2 is a sql timeout
    {
        // handle timeout
    }