【问题标题】:Error in server 'executenonquery requires an open and available connection'服务器“executenonquery 需要打开且可用的连接”中的错误
【发布时间】:2014-11-10 05:45:39
【问题描述】:

我在非本地服务器上收到此错误,当遇到此错误时,我重新上传了相关的类文件。在解决了这个问题后,但不是永久的。

错误:

executenonquery 需要一个开放且可用的连接。这 连接的当前状态为打开。

代码:

int n;

try
{
    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.Connection = DataConnection.Con;
        cmd.CommandText = "sp_InsertUpdateDeleteValidationDate";
        cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 0;
        cmd.Parameters.AddWithValue("@Task", "CheckExist");
        cmd.Parameters.AddWithValue("@id", 0);
        cmd.Parameters.AddWithValue("@AdId", "");
        cmd.Parameters.AddWithValue("@Username", "");
        cmd.Parameters.AddWithValue("@DOE", DOE);
        cmd.Parameters.AddWithValue("@ExpieryDate", DateTime.Now);
        cmd.Parameters.AddWithValue("@DOR", DateTime.Now);
        cmd.Parameters.Add("@flag", SqlDbType.Int).Direction = ParameterDirection.Output;

        if (cmd.Connection.State  == ConnectionState.Closed)
        {
            cmd.Connection.Open();
        }
        cmd.ExecuteNonQuery();
        n = Convert.ToInt32(cmd.Parameters["@flag"].Value);
        return n;
    }
}
catch (SqlException Ex)
{

    return 0;
}

【问题讨论】:

  • 什么是DataConnection?
  • 这可能会有所帮助stackoverflow.com/questions/9705637/…
  • public class DataConnection { private static SqlConnection SqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);公共静态 SqlConnection Con { 获取 { 返回 SqlCon; } } }
  • 请将其添加到您的问题中,以便其可读

标签: c# connection executenonquery


【解决方案1】:

您只能在 DataConnection 类中创建一个连接。您应该为每个数据库调用创建一个新连接,并让驱动程序的连接池负责有效地重用它们。

将您的 DataConnection 类更改为:

public class DataConnection
{
    public static SqlConnection Con
    {
        get 
        { 
            return new SqlConnection(ConfigurationManager
                .ConnectionStrings["conn"].ConnectionString); 
        }
    }
}

并在使用连接时使用 using 语句,如 ekad 的回答:

using (SqlConnection conn = DataConnection.Con)
{
    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.Connection = conn;
        //use the command here
    }
}

【讨论】:

  • 您能再解释一下吗?我也有类似的情况,但是异常只报过一次。我什至创建了一个测试应用程序,它在不关闭连接的情况下删除并重新插入相同的记录 1000 次,也没有遇到错误。是不是这种情况只会偶尔发生 - 即,如果使用单个打开的连接进行多个数据库调用 - 如果是这样,为什么?
【解决方案2】:

看起来您的SqlConnection 从未关闭。尝试使用using statement确保SqlConnection在执行cmd.ExecuteNonQuery()后关闭

int n;

try
{
    using (SqlConnection conn = DataConnection.Con)
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandText = "sp_InsertUpdateDeleteValidationDate";
            cmd.CommandType = CommandType.StoredProcedure; cmd.CommandTimeout = 0;
            cmd.Parameters.AddWithValue("@Task", "CheckExist");
            cmd.Parameters.AddWithValue("@id", 0);
            cmd.Parameters.AddWithValue("@AdId", "");
            cmd.Parameters.AddWithValue("@Username", "");
            cmd.Parameters.AddWithValue("@DOE", DOE);
            cmd.Parameters.AddWithValue("@ExpieryDate", DateTime.Now);
            cmd.Parameters.AddWithValue("@DOR", DateTime.Now);
            cmd.Parameters.Add("@flag", SqlDbType.Int).Direction = ParameterDirection.Output;

            conn.Open();        
            cmd.ExecuteNonQuery();
            n = Convert.ToInt32(cmd.Parameters["@flag"].Value);
            return n;
        }
    }
}
catch (SqlException Ex)
{

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2022-08-03
    相关资源
    最近更新 更多