Соединение должно быть действительным и открытым (снова) - PullRequest
2 голосов
/ 21 ноября 2010

У меня ошибка "Соединение должно быть действительным и открываться снова, когда я изменил свой код запроса sql. Может кто-нибудь помочь ?? (править) В форме 1 я подключился к базе данных, в форме 2 я пытаюсь добавить запросы.

//IN Class1.cs
public void test(string query, string name)
{
    MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand(query, connection);
    cmd.CommandText = @query;
    cmd.Parameters.AddWithValue("Name", name);
    MySql.Data.MySqlClient.MySqlDataReader Reader = cmd.ExecuteReader();
    while (Reader.Read())
    {
        Console.WriteLine(Reader[0]);
    }
    cmd.ExecuteNonQuery();
}
//IN Form2.cs
private void button2_Click(object sender, EventArgs e)
{
    name = textBox1.Text;
    var obj = new Class1();
    obj.test(@"SELECT * FROM players WHERE name = ?Name;", name);
}

Ответы [ 3 ]

2 голосов
/ 21 ноября 2010

Похоже, что соединение удаляется (или, возможно, даже не открывается вообще!)

В идеале я бы изменил это, чтобы использовать подход единичной работы, а также обернуть ваши экземпляры при использованииблоки для обеспечения их правильной утилизации:

using (var connection = new MySqlConnection("connection-string"))
{
  using (var command = new MySqlCommand(query, connection))
  {
    connection.Open();

    command.Parameters.AddWithValue("?name", name);

    using (var reader = command.ExecuteReader())
    {
      while (reader.Read())
      {
        Console.WriteLine(reader[0]);
      }
    }
  }
}

Кроме того, какова цель вызова cmd.ExecuteNonQuery(); после того, как вы уже использовали ExecuteReader()?

0 голосов
/ 13 августа 2012

У меня возникла именно эта проблема, когда я открыл соединение в одном классе и попытался использовать его в другом классе / форме.Совершенно нормально одновременно открывать более одного соединения, поэтому создайте новый экземпляр MySqlConnection для каждого класса, а затем откройте и закройте его внутри этого класса.

0 голосов
/ 21 ноября 2010

Попробуйте:

cmd.Open();

... ПЕРЕД ExecuteNonQuery ()

:) Я надеюсь, это поможет, пожалуйста, сообщите, если у вас все еще есть проблемы.

Кроме того, в настоящее время попробуйте удалить cmd.ExecuteNonQuery, так как я думаю, что он может подключаться дважды, поэтому возникает ошибка «Соединение должно быть действительным и открытым».Он не должен быть «открытым», потому что вы уже подключены с помощью ExecuteReader ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...