sql >> Base de Datos >  >> RDS >> Mysql

La conexión C# Mysql debe ser válida y abierta

El problema es que no almacena la conexión que se devolvió desde su propiedad de fábrica. Pero no use una propiedad como un método. En su lugar, utilícelo de esta manera:

using (var con = Services.conn)
{
    Services.conn.Open();
    Services.DB_Select("..a short select statement..", con ));
    //Services.conn.Close(); unnecessary with using
}

Así que use la misma conexión en el uso que fue devuelta por la propiedad (o mejor creada en el uso) y pásela al método que la usa. Por cierto, usar una propiedad como método de fábrica no es una buena práctica.

Pero en mi opinión, es mucho mejor crear la conexión donde la usas, el mejor lugar es using declaración. Y lanza el con propiedad a la papelera, no tiene sentido y es una fuente de errores desagradables.

public static void DB_Select(string s, params List<string>[] lists)
{
    try
    {
         using(var conn = new MySqlConnection(Services.ServerConnection))
         {
            conn.Open();
            MySqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = s;
            using( var sqlreader = cmd.ExecuteReader())
            while (sqlreader.Read())
            {
                if (sqlreader[0].ToString().Length > 0)
                {
                    for (int i = 0; i < lists.Count(); i++)
                    {
                        lists[i].Add(sqlreader[i].ToString());
                    }
                }
                else
                {
                    foreach (List<string> save in lists)
                    {
                        save.Add("/");
                    }
                }
            } // unnecessary to close the connection
        }     // or the reader with the using-stetement
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error while selecting data from database!\nDetails: " + ex);
    }
}