2010-11-21 2 views
2

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

//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); 
} 

ответ

2

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

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

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

Он был открыт в FORM1, код, который я написал выше, из FORM2. – Marcus

0

Try:

cmd.Open(); 

... ПЕРЕД ExecuteNonQuery()

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

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

+0

cmd.Open() не работает, его даже не указали вообще. (если вы говорите о соединении.Open() Я могу сказать, что он уже открыт в FORM1, в первом окне. – Marcus

0

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

Смежные вопросы