Создайте отдельный класс для строки подключения

#c# #winforms

#c# #winforms

Вопрос:

я пытаюсь создать отдельный класс для соединения с именем Connection.cs, почему у меня возникает эта ошибка при выполнении запроса

ExecuteNonQuery requires an open and available Connection. The connection's current state is closed

что я делаю не так?

в моем классе Dal.cs

  public void Insert(string f1,string f2)
            {
                string query;
                Connection c = new Connection();
                c.OpenCnn();
                try  {
                    query = "inset into ..."
                    cmd = new SqlCommand(query, con);
                    cmd.ExecuteNonQuery();
                }

               catch (Exception ex){
                   throw ex;
                }

                finally {
                     c.CloseCnn();
                }
            }
  

и в моем классе Connection.cs

 public class Connection

    {
        SqlCommand cmd = new SqlCommand();
        SqlConnection con = new SqlConnection();

        public void OpenCnn()
        {
       string cnnStr = ConfigurationManager.ConnectionStrings["myconnstrng"].ToString();
            con = new SqlConnection(cnnStr);
            con.Open();
        }

        public void CloseCnn()
        {

            con.Close();
        }
    }
  

Комментарии:

1. Вы пытались отлаживать?

2. Какую ошибку вы получаете и когда? Попробуйте отладку

3. Откуда con взялся метод Insert? В Connection классе нет ничего общедоступного.

Ответ №1:

В настоящее время поле con является private и не может быть доступно извне Connection класса.

Вы можете добавить свойство к своему классу подключения:

 public SqlConnection Connection { get { return con; } }
  

Затем получите доступ к нему через ваш экземпляр:

  Connection c = new Connection();
 c.OpenCnn();
 try 
 {
      query = "inset into ..."
      cmd = new SqlCommand(query, c.Connection);
      cmd.ExecuteNonQuery();
 }
  

Кстати, я не уверен, на что вы ссылаетесь con в своем Insert методе (вероятно, на локальную переменную вместо con поля, потому что в противном случае она даже не компилировалась бы)

Комментарии:

1. спасибо, это сработало, я определял SqlConnection con = new SqlConnection(); в моем методе insert

Ответ №2:

 public class Connection
{       
    SqlConnection con;

    public SqlConnection Conn { get { return con; } }

    public void OpenCnn()
    {
        string cnnStr = ConfigurationManager.ConnectionStrings["myconnstrng"].ToString();
        con = new SqlConnection(cnnStr);
        con.Open();
    }

    public void CloseCnn()
    {
        con.Close();
    }
}
  

Метод Insert :

Обратите внимание на SqlCommand инициализацию и использование общедоступного свойства conn .

 public void Insert(string f1, string f2)
{
    string query;
    Connection c = new Connection();
    c.OpenCnn();
    try  
    {
        query = "insert into ..."
        SqlCommand cmd = new SqlCommand(query, c.Conn);
        cmd.ExecuteNonQuery();
    }
    catch (Exception ex){
               throw ex;
    }
    finally {
       c.CloseCnn();
    }
 }