Open it each time: there are two simple reasons.
1) SQL connections are scarce resources - you shouldn't "hang onto them" any longer than you need to.
2) Some parts of SQL - such as a DataReader - need to be closed before any other action can continue on the same connection: if you rely on a single connection object, this can really mess up your code if you don't automatically close and Dispose of SqlCommand and suchlike objects, or if you call a method from within a DataReader loop.
The best practice is to create the connection (and all other SQL related objects) within a
using
block so they are automatically closed and Disposed when they go out of scope:
using (SqlConnection con = new SqlConnection(strConnect))
{
con.Open();
using (SqlCommand cmd = new SqlCommand("SELECT Id, description FROM myTable", con))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int id = (int) reader["Id"];
string desc = (string) reader["description"];
Console.WriteLine("ID: {0}\n {1}", id, desc);
}
}
}
}