Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# 将在using语句中返回关键字,保持连接打开?_C#_Ado.net_Database Connection_Sqlconnection_Timeoutexception - Fatal编程技术网

C# 将在using语句中返回关键字,保持连接打开?

C# 将在using语句中返回关键字,保持连接打开?,c#,ado.net,database-connection,sqlconnection,timeoutexception,C#,Ado.net,Database Connection,Sqlconnection,Timeoutexception,SqlConnection.Open()上出现超时过期异常 代码如下: public int ExecuteNonQuery(SqlParameter[] param, string strSPName) { using (SqlConnection conn = new SqlConnection(_connStr)) { int i = 0; using (SqlCommand cmd = new SqlCommand(strSPName, c

SqlConnection.Open()上出现超时过期异常

代码如下:

public int ExecuteNonQuery(SqlParameter[] param, string strSPName)
{
    using (SqlConnection conn = new SqlConnection(_connStr))
    {
        int i = 0;
        using (SqlCommand cmd = new SqlCommand(strSPName, conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(param);
            conn.Open();
            i = cmd.ExecuteNonQuery();
        }
        return i;
    }
}
是否返回
语句中的
关键字,使连接保持打开状态,从而导致此问题

using语句中的return关键字是否使连接保持打开状态,从而导致此问题

否。
using
语句实际上是
finally
部分中的try/finally block语句a
Dispose
调用-因此您的连接在该方法结束时仍将被释放

我怀疑您是在同一时间从太多线程调用它,并以这种方式耗尽您的池,还是在其他地方打开连接而没有关闭它

请注意,通过去掉
i
局部变量,可以简化代码:

public int ExecuteNonQuery(SqlParameter[] param, string strSPName)
{
    using (SqlConnection conn = new SqlConnection(_connStr))
    {
        using (SqlCommand cmd = new SqlCommand(strSPName, conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(param);
            conn.Open();
            return cmd.ExecuteNonQuery();
        }
    }
}
同样,命令和连接仍将被适当地处理

using语句中的return关键字是否使连接保持打开状态,从而导致此问题

否。
using
语句实际上是
finally
部分中的try/finally block语句a
Dispose
调用-因此您的连接在该方法结束时仍将被释放

我怀疑您是在同一时间从太多线程调用它,并以这种方式耗尽您的池,还是在其他地方打开连接而没有关闭它

请注意,通过去掉
i
局部变量,可以简化代码:

public int ExecuteNonQuery(SqlParameter[] param, string strSPName)
{
    using (SqlConnection conn = new SqlConnection(_connStr))
    {
        using (SqlCommand cmd = new SqlCommand(strSPName, conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(param);
            conn.Open();
            return cmd.ExecuteNonQuery();
        }
    }
}

同样,命令和连接仍然会被适当地处理。

因为它是try-finally语句的语法糖,不,它不会。这个语句有很多重复,但不能选择。因为它是try-finally语句的语法糖,不,它不会。这个语句有很多重复,但不能选择。谢谢Jon。是的,一次可以从多个用户调用它。上面的代码是否可以防止
超时
异常?@sth:不,我提供的代码片段在功能上是等效的,但比您当前的代码更简单。根据您有多少并发用户以及存储过程运行所需的时间,您可能只需要增加连接池的大小-但我们不知道足够的上下文。我希望增加连接池大小不会有任何副作用。@sth:您的数据库将有更多的工作要做-但基本上我们不知道这是否是一个问题,因为我们没有上下文。谢谢Jon。是的,一次可以从多个用户调用它。上面的代码是否可以防止
超时
异常?@sth:不,我提供的代码片段在功能上是等效的,但比您当前的代码更简单。根据您有多少并发用户以及存储过程运行所需的时间,您可能只需要增加连接池的大小-但我们不知道足够的上下文。我希望增加连接池大小不会有任何副作用。@sth:您的数据库将有更多的工作要做-但基本上我们不知道这是否是一个问题,因为我们没有上下文。