Есть код подключения к БД и запрос к ней -
SqlConnection SqlConnection;
public async void connectDB()
{
string ConnectionAdres = @"Путь";
SqlConnection = new SqlConnection(ConnectionAdres);
await SqlConnection.OpenAsync();
SqlDataReader SQLDReader = null;
SqlCommand GetAllEmployCommand = new SqlCommand("SELECT * FROM [employment]", SqlConnection);
try
{
SQLDReader = await GetAllEmployCommand.ExecuteReaderAsync();
while (await SQLDReader.ReadAsync())
{
string test = Convert.ToString(SQLDReader["ID"]) + Convert.ToString(SQLDReader["surname"]) + Convert.ToString(SQLDReader["name"]) + Convert.ToString(SQLDReader["patronymic"]);
}
}
catch (Exception ex)
{
}
finally
{
if (SQLDReader != null)
{
SQLDReader.Close();
}
}
public void closeConnect()
{
if (SqlConnection != null && SqlConnection.State != ConnectionState.Closed)
{
SqlConnection.Close();
}
}
Как можно разделить подключение и запросы? И нормально если подключение будет открыто на протяжении всё работы программы? Нажимаю на кнопку->с начала вызывается метод подключения, потом запроса. Или писать каждый запрос в коде как у меня это нормальная практика?
В .NET реализован механизим Connection Pooling, который позволяет переиспользовать физическое соединение к базе. Когда вы вызываете SqlConnection.Open - вы получаете готовое соединение из пула. Когда вызываете .Close - возвращаете его в пул. Поэтому держать объект SqlConnection открытым нужно как можно меньше - этим вы позволяете эффективно его переиспользовать. И, заодно, избавляетесь от проблем с обработкой таймаутов неактивности соединения.
По вашему коду - используйте using для работы с SqlConnection и SqlDataReader - он корректно вызовет Dispose (Close) по завершению работы - т.е. сделает за вас то, что вы сейчас делаете в try/finally.
Так что если ваш код сократить, получится примерно следующее:
public async string SelectTest()
{
string connectionString = @"Путь";
using (var sqlConnection = new SqlConnection(connectionString))
{
await sqlConnection.OpenAsync();
SqlCommand getAllEmployCommand = new SqlCommand("SELECT * FROM [employment]", sqlConnection);
using (var reader = await getAllEmployCommand.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
string test = Convert.ToString(reader["ID"]) + Convert.ToString(reader["surname"]) + Convert.ToString(reader["name"]) + Convert.ToString(reader["patronymic"]);
return test; // ?
}
return null; // ?
}
}
}
Но вообще стоит понимать, что ручная работа с ADO.NET - необязательна. Стоит использовать ORM:
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости