Как грамотно связать c# и Sql server?

322
06 июня 2018, 16:00

Есть код подключения к БД и запрос к ней -

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();
        }
    }

Как можно разделить подключение и запросы? И нормально если подключение будет открыто на протяжении всё работы программы? Нажимаю на кнопку->с начала вызывается метод подключения, потом запроса. Или писать каждый запрос в коде как у меня это нормальная практика?

Answer 1

В .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:

  • Entity Framework, если хотите навороченности
  • Dapper, если хотите простоты
READ ALSO
Исходники sscli

Исходники sscli

Всем доброго вечера! Где можно посмотреть исходники sscli? Все ссылки в старых статьях , наподобие этой переадресуют на главную страницу МайкрософтНаходил...

366
помогите ДОБАВИТЬ новые данные в JSON файл (C#)

помогите ДОБАВИТЬ новые данные в JSON файл (C#)

У меня есть определённый JSONХраниться на сайте: http://frzee

285
Интегрированная Среда Разработки для С# [закрыт]

Интегрированная Среда Разработки для С# [закрыт]

Скажите мне пожалуйста,какая IDE самая лучшая для C#? Заранее спасибо

253
Мертвые соединения?

Мертвые соединения?

Это нормально, что если сделать Open с одним ConnectionString, а затем сделать Close, поменять ConnectionString(Например, сменить AppName) и снова открыть, то в sysdm_exec_sessions...

273