【问题标题】:ExecuteNonQuery requires an open and available Connection. The connection's current state is openExecuteNonQuery 需要一个开放且可用的连接。连接的当前状态为打开
【发布时间】:2019-07-25 17:32:57
【问题描述】:

我收到一个错误:

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

我使用了con.Open();,但我遇到了同样的错误。
请帮助我。

static string connectionString = ConfigurationManager.AppSettings["MessageDB"].ToString();
static SqlConnection _sqlconn = new SqlConnection(connectionString);

public static void Message(MessageLog messageLog)
{
    try
    {
        _sqlconn = new SqlConnection(connectionString);
        _sqlconn.Open();

        SqlCommand cmd = _sqlconn.CreateCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "INSERT_MESSAGE";

        SqlParameter APPID = cmd.CreateParameter();
        APPID.ParameterName = @"@MessageID";
        APPID.DbType = DbType.Int16;
        APPID.Direction = ParameterDirection.Input;
        APPID.Value = messageLog.MessageID;
        cmd.Parameters.Add(MessageID);

        cmd.ExecuteNonQuery();

        _sqlconn.Close();
    }
    catch (Exception ex)
    {
        if (_sqlconn.State == ConnectionState.Open)
        {
            _sqlconn.Close();
        }

        ExceptionLogger.LogException(ex);
    }
}

【问题讨论】:

  • 请正确格式化您的问题
  • 恕我直言,将CommandSqlConnection 包装在Using 语句中;那么你的对象将在处理完它们后被丢弃......

标签: c# sql-server connection


【解决方案1】:

恕我直言,您的问题是使用静态连接变量。 static SqlConnection _sqlconn = new SqlConnection(connectionString); 然后您再次分配它,这没有任何意义。我会稍微修改一下你的代码:

static string connectionString = ConfigurationManager.AppSettings["MessageDB"].ToString();
public static void Message(MessageLog messageLog)
{
   using(var _sqlconn = new SqlConnection(connectionString))
   {
      using(var cmd = new SqlCommand())
      {
          cmd.CommandType = CommandType.StoredProcedure;
          cmd.CommandText = "INSERT_MESSAGE";
          cmd.Connection = _sqlconn;

          cmd.Parameters.Add("@MessageID", DbType.Int16).Value = messageLog.MessageID;
          try
          {
              if(_sqlconn.State == ConnectionState.Closed) _sqlconn.Open()

              cmd.ExecuteNonQuery();

          }
          catch (Exception ex)
          {
               ExceptionLogger.LogException(ex);
          } 
          finally
          { 
               if (_sqlconn.State == ConnectionState.Open)
               {
                  _sqlconn.Close();
               }
          }
      }
   }
}       

这种语法的好处?

  • 所有一次性用品都将被丢弃。
  • 无论异常或正常执行流程如何,连接都将始终关闭。
  • 没有尝试打开已打开的连接。
  • 连接始终可用,因为它每次都从连接池中获取,而不是“冻结”静态变量。

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 2015-04-17
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多