接続が閉じられていない。

私の関数では接続が既に終了しているのですが、どうすれば直せますか?

SqlConnection con=new SqlConnection(@"Here is My Connection");

public void run_runcommand(string query)   
{   

    try   
    {   
        con.Open();   
        SqlCommand cmd1 = new SqlCommand(query, con);   

        cmd1.ExecuteNonQuery();    
        con.Close();    
    }    
    catch (Exception ex) { throw ex; }                        
}    
//...
try       
{           
    string query="my query";           
    db.run_runcommand(query);          
}         
catch(Exception ex)            
{         
    MessageBox.Show(ex.Message);              
}

この行でエラーが発生するのだと思われます。

con.Open(); // InvalidOperationException if it's already open

というのは、接続を再利用しており、おそらく前回閉じていないためです。

接続を終了したら、常にすぐに接続を閉じるべきです。それには using-statement を使用するのが最適です。

public void run_runcommand(string query)   
{
    using(var con = new SqlConnection(connectionString))
    using(var cmd = new SqlCommand(query, con))
    {
        con.Open();
        // ...
    }  // close not needed since dispose also closes the connection
}

例外を再スローするためだけに Catch ブロックを使ってはいけないことに注意してください。もし、何もしないのであれば、キャッチする必要はありません。スタックトレースを残すために、throw ex;の代わりに throw; を使うとさらに良いでしょう。 https://stackoverflow.com/a/4761295/284240

解説 (2)
ソリューション

そのため、try catchブロックを使っているところでは、finallyブロックとその中に con.close() を記述するのがよいでしょう。 例えば

public void run_runcommand(string query)   
{   
    try   
    {   
        con.Open();   
        SqlCommand cmd1 = new SqlCommand(query, con);   

        cmd1.ExecuteNonQuery();    
        con.Close();    
    }    
    catch (Exception ex)
    {
       throw ex; //TODO: Please log it or remove the catch
    }
    finally
    {
       con.close();
    }

}

try       
{           
    string query="my query";           
    db.run_runcommand(query);          
}         
catch(Exception ex)            
{         
    MessageBox.Show(ex.Message);              
}   
finally
{
   con.close();
}
解説 (7)

接続状態を確認してから開いてください。

if (con.State != ConnectionState.Open)
    con.Open(); 
解説 (0)