连接没有关闭。连接';的当前状态是打开的。C#

连接没有关闭。连接';的当前状态是打开的。C#,c#,asp.net,C#,Asp.net,我一直在获取材料总成本时出错,我已经检查了整个过程。我甚至删除了多余的con.Close,但错误仍然会提示t 上述错误出现在第679行,这通常是因为您使用了全局连接对象,并且代码中的某个地方连接未正确关闭。例如,代码中的某个地方触发了异常,在这种情况下,您忘记关闭连接 分辨率始终相同。 不要保留全局连接对象。 在需要时创建它,并使用适当的语法销毁它。 这是为了在create/open/use/close场景中提供更好的性能而设计的 decimal GetTotalMaterialCos

我一直在获取材料总成本时出错,我已经检查了整个过程。我甚至删除了多余的con.Close,但错误仍然会提示t






上述错误出现在第679行,这通常是因为您使用了全局连接对象,并且代码中的某个地方连接未正确关闭。例如,代码中的某个地方触发了异常,在这种情况下,您忘记关闭连接

分辨率始终相同。
不要保留全局连接对象。
在需要时创建它,并使用适当的语法销毁它。

这是为了在
create/open/use/close
场景中提供更好的性能而设计的

decimal GetTotalMaterialCost()
{
    decimal total = 0;
    string query = @"SELECT SUM(rm.Quantity * m.SellingPrice) AS TotalMaterialCost 
                    FROM Resource_Materials rm 
                    JOIN Materials m ON m.MaterialID = rm.MaterialID 
                    JOIN ProjectTasks t ON t.TaskID = rm.TaskID
                    WHERE t.TaskID=@TaskID HAVING COUNT (*) > 0";

    using(SqlConnection con = new SqlConnection(....constringhere...)
    using(SqlCommand cmd = new SqlCommand(query, con))
    {
        con.Open();
        .....
     }
    return total;
}
通过这种方式,连接对象是本地的,并且确保即使遇到某种异常,也会在右大括号处关闭和释放连接对象

当然,这种模式应该应用于您试图访问数据库的每一点,并且应该删除全局连接对象。唯一可以保持全局的是连接字符串,而且对于它,还有一个更好的存储位置(即app.config ConnectionString部分)

表示您可能因使用AddWithValue而导致错误。此方法定义查看传递值的参数的数据类型。看起来您的TaskID字段是一个整数,但您使用AddWithValue准备了一个参数并传递了一个字符串。因此,查询将使用具有错误数据类型的参数。 我建议使用

cmd.Parameters.Add("@TaskID", SqlDbType.Int).Value = 
       Convert.ToInt32(Request.QueryString["ID"].ToString()));
最后,粗略地看一下您的代码,我建议更改Page_Load调用的方法,以接收直接在Page_Load事件中打开的连接对象

if (!IsPostBack)
{
    using(SqlConnection con = new SqlConnection(....constringhere...)
    {
        GetProjectMaterials(con);
        GetProjectEquipments(con);
        GetProjectVehicle(con);
        GetProjectContractors(con);
        GetTasks(con,resourceID);
        GetMaterials(con);
        GetEquipments(con);
        GetVehicles(con);
        GetLContractors(con);
    }
}

当然,您还需要更改调用这些方法的其他方法来传递连接,但是如果我没有错的话,您已经必须在这些调用者中建立连接。

这通常发生,因为您使用了全局连接对象,而代码中的某个地方连接未正确关闭。例如,代码中的某个地方触发了异常,在这种情况下,您忘记关闭连接

分辨率始终相同。
不要保留全局连接对象。
在需要时创建它,并使用适当的语法销毁它。

这是为了在
create/open/use/close
场景中提供更好的性能而设计的

decimal GetTotalMaterialCost()
{
    decimal total = 0;
    string query = @"SELECT SUM(rm.Quantity * m.SellingPrice) AS TotalMaterialCost 
                    FROM Resource_Materials rm 
                    JOIN Materials m ON m.MaterialID = rm.MaterialID 
                    JOIN ProjectTasks t ON t.TaskID = rm.TaskID
                    WHERE t.TaskID=@TaskID HAVING COUNT (*) > 0";

    using(SqlConnection con = new SqlConnection(....constringhere...)
    using(SqlCommand cmd = new SqlCommand(query, con))
    {
        con.Open();
        .....
     }
    return total;
}
通过这种方式,连接对象是本地的,并且确保即使遇到某种异常,也会在右大括号处关闭和释放连接对象

当然,这种模式应该应用于您试图访问数据库的每一点,并且应该删除全局连接对象。唯一可以保持全局的是连接字符串,而且对于它,还有一个更好的存储位置(即app.config ConnectionString部分)

表示您可能因使用AddWithValue而导致错误。此方法定义查看传递值的参数的数据类型。看起来您的TaskID字段是一个整数,但您使用AddWithValue准备了一个参数并传递了一个字符串。因此,查询将使用具有错误数据类型的参数。 我建议使用

cmd.Parameters.Add("@TaskID", SqlDbType.Int).Value = 
       Convert.ToInt32(Request.QueryString["ID"].ToString()));
最后,粗略地看一下您的代码,我建议更改Page_Load调用的方法,以接收直接在Page_Load事件中打开的连接对象

if (!IsPostBack)
{
    using(SqlConnection con = new SqlConnection(....constringhere...)
    {
        GetProjectMaterials(con);
        GetProjectEquipments(con);
        GetProjectVehicle(con);
        GetProjectContractors(con);
        GetTasks(con,resourceID);
        GetMaterials(con);
        GetEquipments(con);
        GetVehicles(con);
        GetLContractors(con);
    }
}

当然,您还需要更改调用这些方法的其他方法来传递连接,但是如果我没有错的话,您已经必须在这些调用者中建立连接。

这通常发生,因为您使用了全局连接对象,而代码中的某个地方连接未正确关闭。例如,代码中的某个地方触发了异常,在这种情况下,您忘记关闭连接

分辨率始终相同。
不要保留全局连接对象。
在需要时创建它,并使用适当的语法销毁它。

这是为了在
create/open/use/close
场景中提供更好的性能而设计的

decimal GetTotalMaterialCost()
{
    decimal total = 0;
    string query = @"SELECT SUM(rm.Quantity * m.SellingPrice) AS TotalMaterialCost 
                    FROM Resource_Materials rm 
                    JOIN Materials m ON m.MaterialID = rm.MaterialID 
                    JOIN ProjectTasks t ON t.TaskID = rm.TaskID
                    WHERE t.TaskID=@TaskID HAVING COUNT (*) > 0";

    using(SqlConnection con = new SqlConnection(....constringhere...)
    using(SqlCommand cmd = new SqlCommand(query, con))
    {
        con.Open();
        .....
     }
    return total;
}
通过这种方式,连接对象是本地的,并且确保即使遇到某种异常,也会在右大括号处关闭和释放连接对象

当然,这种模式应该应用于您试图访问数据库的每一点,并且应该删除全局连接对象。唯一可以保持全局的是连接字符串,而且对于它,还有一个更好的存储位置(即app.config ConnectionString部分)

表示您可能因使用AddWithValue而导致错误。此方法定义查看传递值的参数的数据类型。看起来您的TaskID字段是一个整数,但您使用AddWithValue准备了一个参数并传递了一个字符串。因此,查询将使用具有错误数据类型的参数。 我建议使用

cmd.Parameters.Add("@TaskID", SqlDbType.Int).Value = 
       Convert.ToInt32(Request.QueryString["ID"].ToString()));
最后,粗略地看一下您的代码,我建议更改Page_Load调用的方法,以接收直接在Page_Load事件中打开的连接对象

if (!IsPostBack)
{
    using(SqlConnection con = new SqlConnection(....constringhere...)
    {
        GetProjectMaterials(con);
        GetProjectEquipments(con);
        GetProjectVehicle(con);
        GetProjectContractors(con);
        GetTasks(con,resourceID);
        GetMaterials(con);
        GetEquipments(con);
        GetVehicles(con);
        GetLContractors(con);
    }
}

当然,您还需要更改调用这些方法的其他方法来传递连接,但是如果我没有错的话,您已经必须在这些调用者中建立连接。

这通常发生,因为您使用了全局连接对象,而代码中的某个地方连接未正确关闭。例如,代码中的某个地方触发了异常,在这种情况下,您忘记关闭连接

分辨率始终相同。
不要保留全局连接对象。
在需要的时候创建它,然后用