2016-06-23 3 views
-2

Я новичок в C#, но я разрабатываю простой графический интерфейс для управления моей базой данных mysql. Мне нужно поддерживать соединение открытым до конца программы (когда я его закрываю), но после нажатия кнопки подключения я вставляю некоторые данные, но программа показывает, что «соединение должно быть действительным и открытым». Не могли бы вы помочь мне?соединение должно быть действительным и открытым C#

namespace MysqlConn 
{ 
    public partial class Form1 : Form 
    { 
     private static MySqlConnection conn; 
     MySqlCommand mcd; 

     private void button1_Click(object sender, EventArgs e) 
     { 
      GetConn();   
     } 

     public static MySqlConnection GetConn() 
     { 
      conn = new MySqlConnection("datasource=localhost;port=3306;username='+UserName'; password= '+PassWord'"); 
      MessageBox.Show("OK.."); 
      return conn; 
     } 

     public Form1() 
     { 
      InitializeComponent(); 
      String DataBase = textBoxDb.Text; 
      String UserName = textBoxUserName.Text; 
      String PassWord = textBoxPassword.Text; 

     } 

     public void openCon() 
     { 
      if (conn.State == ConnectionState.Closed) 
      { 
       conn.Open(); 
      } 
     } 

     public void closedConn() 
     { 
      if (conn.State == ConnectionState.Open) 
      { 
       conn.Close(); 
      } 
     } 

     public void executeQuery(String s) 
     { 
      try 
      { 

       mcd = new MySqlCommand(s, conn); 
       if (mcd.ExecuteNonQuery() == 1) 
       { 
        MessageBox.Show("Query executed"); 
       } 
       else 
       { 
        MessageBox.Show("Query not executed"); 
       } 

      } catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } finally 
      { 

      } 
     } 

     private void buttonInsert_Click_1(object sender, EventArgs e) 
     { 
      string s = "insert into prova_csharp.users (Name, Surname, Age) values ('"+textBoxName.Text+"', '"+textBoxSurname.Text+"', '"+textBoxAge.Text+"')"; 
      executeQuery(s); 
     } 

     private void buttonUpdate_Click(object sender, EventArgs e) 
     { 
      string s = "update prova_csharp.users set Name='" + textBoxName.Text + "', Surname='" + textBoxSurname.Text + "', Age=" + textBoxAge.Text + " where Id=" + textBoxId.Text; 
      executeQuery(s); 
     } 

     private void buttonDelete_Click(object sender, EventArgs e) 
     { 
      string s = "delete from prova_csharp.users where Id = " + textBoxId.Text; 
      executeQuery(s); 
      textBoxId.Text = ""; 
     } 

    } 
} 
+0

Ну, единственное место, где вы открываете соединение, находится внутри 'openCon()', и это никогда не вызывается. – pay

+0

Ошибка кажется довольно сам пояснительный. Я бы предположил, что соединение не открыто, поскольку я не вижу нигде, где вы на самом деле называете 'openCon', или иначе называете' conn.Open'. –

+2

Также убедитесь, что вы используете параметризованные запросы. Это классическая SQL-инъекция, использующая пользовательский ввод (текстовое поле) в таких вставках. И вызовите Dispose в этом соединении, когда вы закончите с ним. – Nikki9696

ответ

0

Вы вызываете только GetConn(); при нажатии кнопки.

conn = new MySqlConnection("datasource=localhost;port=3306;username='+UserName'; password= '+PassWord'"); 
    MessageBox.Show("OK.."); 
    return conn; 

Создание нового соединения не открывает его. добавьте conn.Open() в GetConn(); функции, а затем только conn.Close() при необходимости.

+0

спасибо другу, ваша помощь была фундаментальной! – alex