Во-первых, вы должны использовать операторы «using», чтобы убедиться, что все ваши объекты ADO.NET правильно удалены в случае сбоя:
public static void ExecuteNonQuery(string sql)
{
using(var con = GetConnection())
{
con.Open();
using(var cmd = new SqlCommand(sql, con))
{
cmd.ExecuteNonQuery();
}
}
}
Однако, сказав это, я не вижу проблемы с этим подходом. Преимущество состоит в том, что соединения, команды, адаптеры и тому подобное корректно удаляются каждый раз, когда вы выполняете немного SQL. Если бы вы создавали один статический экземпляр SqlConnection, вы бы повысили вероятность того, что соединение уже используется (например, при переборе содержимого SqlDataReader).
Если вы действительно обеспокоены этим, укажите перегрузки, которые принимают соединение в качестве дополнительного параметра:
public static void ExecuteNonQuery(string sql, SqlConnection connection)
{
using(var cmd = new SqlCommand(sql, con))
{
cmd.ExecuteNonQuery();
}
}
Таким образом, абоненты могут либо выполнить немного SQL, который не требует нескольких вызовов, либо они могут вызвать ваш GetConnectionMethod для получения соединения и передать его нескольким вызовам.