Поскольку c # является языком сборки мусора, а сборка мусора не является детерминированной. Дело в том, что ваше sqlconnection настроено на . Вы просто не можете выбирать, когда.
Sql-соединения являются ограниченным ресурсом, и вполне возможно, что вы можете создать их достаточно, чтобы они закончились. Напишите это так:
internal static DataSet SelectDataSet(String commandText, DataBaseEnum dataBase)
{
var dataset = new DataSet();
using (SqlConnection sqlc = dataBase == DataBaseEnum.ZipCodeDb
? new SqlConnection(ConfigurationManager.AppSettings["ZipcodeDB"])
: new SqlConnection(ConfigurationManager.AppSettings["WeatherDB"]))
using (SqlCommand sqlcmd = sqlc.CreateCommand())
{
sqlcmd.CommandText = commandText;
var adapter = new SqlDataAdapter(sqlcmd.CommandText, sqlc);
adapter.Fill(dataset);
}
return dataset;
}
Хотя в этом случае вам это может сойти с рук, потому что метод .Fill()
- странный зверь:
Если IDbConnection закрывается до вызова Fill, он открывается для извлечения данных, а затем закрывается.
Так что это означает, что адаптер данных должен позаботиться о вас, если вы начинаете с закрытого соединения. Я гораздо больше обеспокоен тем, что вы передаете команду sql в виде простой строки. Время от времени в ваших запросах должны быть пользовательские параметры, и это означает, что вы объединяете эти данные непосредственно в командной строке. Не делайте этого! * Вместо этого используйте коллекцию Paramters SqlCommand.