C#. ADO .NET. Приєднаний режим (connected mode). Клас DbConnection

Приєднаний режим (connected mode). Клас DbConnection

Перед вивченням даної теми рекомендується ознайомитись з темою:


Зміст


1. Клас DbConnection. Загальні відомості

Клас DBConnection використовується для підключення до бази даних з додатку у приєднаному режимі (connected mode). Поняття “приєднаний режим” означає, що всі операції з базою даних (читання, вставка, оновлення, видалення) виконуються в момент, коли база даних приєднана (відкрита). Для відкриття з’єднання з базою даних використовується метод Open() класу. Щоб закрити з’єднання використовується метод Close().

Клас DbConnection реалізує інтерфейс IDbConnection. Більш детально про особливості реалізації інтрефейсу IDbConnection можна прочитати тут.

Щоб використовувати IDbConnection та похідні від нього класи потрібно підключити простір імен System.Data.Common

using System.Data.Common;

Клас DBConnection є базовим для всіх інших класів підключень SqlConnection, OdbcConnection, OledbConnection.

З допомогою об’єкту типу DbConnection можна задавати:

  • тип джерела даних;
  • розміщення джерела даних;
  • різноманітні атрибути джерела даних.

Об’єкт типу DbConnection використовується для з’єднання з базою даних та від’єднання від неї.

 

2. Аналіз методів та властивостей класу DbConnection

Крім двох вищезгаданих методів Close() та Open() клас DbConnection має ряд інших властивостей та методів.

У наступній таблиці відображено властивості класу SqlConnection.

Властивість Тип даних Опис
ConnectionString String Визначає спосіб підключення об’єкту SqlConnection до джерела
ConnectionTimeOut Int32 Задає інтервал часу в секундах, протягом якого об’єкт SqlConnection пробує встановити з’єднання з джерелом даних (доступне тільки для читання)
Database String Визначає ім’я бази даних до яких відбулось підключення
DataSource String Повертає інформацію про розміщення бази даних до якої відбувається або відбулось підключення (доступне тільки для читання)
PacketSize Int32 Розмір пакету, який використовується для обміну інформацією з базою даних SQL Server (тільки для читання)
ServerVersion String Версія джерела даних (тільки для читання).
State ConnectionState Вказує поточний стан об’єкту SqlConnection – активний або знищений (доступне тільки для читання)
WorkstationId String Повертає ім’я клієнта БД. За замовчуванням рівне імені комп’ютера

Методи об’єкту SqlConnection зображені у наступній таблиці.

Метод Опис
BeginTransaction Починає транзакцію для з’єднання
ChangeDatabase При відкритому з’єднанні перемикає на вказану БД
ClearAllPools Очищає вільні з’єднання у всіх пулах SqlConnection. Це статичний метод
ClearPool Очищає вільні з’єднання у пулі з’єднань з відповідним переданим об’єктом типу SqlConnection. Це статичний метод
Close Закриває з’єднання
CreateCommand Створює об’єкт типу SqlCommand для поточного з’єднання
GetSchema Отримує інформацію схеми для з’єднання
Open Відкриває з’єднання
ResetStatistics Скидує статистику для поточного з’єднання
RetrieveStatistics Повертає статистику для поточного з’єднання

 

3. Створення, відкриття і закриття з’єднання. Фрагмент

У найбільш загальному випадку процедура використання з’єднання з базою даних складається з наступних кроків.

1. Створення з’єднання (підключення)

SqlConnection connection = new SqlConnection(connStr);

тут connStr – рядок з’єднання з базою даних (Connection String).

2. Відкриття з’єднання

connection.Open();

Після відкриття з’єднання з базою даних можна вносити зміни в цю базу даних.

3. Закриття з’єднання

connection.Close();

Після закриття, з’єднання з базою даних залишається у так званому “пулі з’єднань” до наступного звертання.

 

4. Приклади з’єднання з джерелом даних

У прикладах нижче демонструються різні способи зміни даних та їх читання у під’єднаному режимі. Джерелом даних є Sql Server. Розглядаються фрагменти коду для додатку типу Windows Forms, зокрема обробники подій кліку на кнопці Button.

4.1. Встановлення підключення. Методи Open() та Close()

Встановити підключення та отримати інформацію про особливості джерела даних можна приблизно наступним чином.

// Метод, що створює SQL-з'єднання з базою даних
private void CreateSQLConnection()
{
  // Create SQL Connection
  // 1. Рядок з'єднання з базою даних
  string connStr = @"Data Source=(localdb)\ProjectModels;" +
      "Initial Catalog=Database4;Integrated Security=True;" +
      "Connect Timeout=30;Encrypt=False;" +
      "TrustServerCertificate=False;ApplicationIntent=ReadWrite;" +
      "MultiSubnetFailover=False";

  // 2. Створити підключення на основі рядка з'єднання
  using (SqlConnection connection =
    new SqlConnection(connStr))
  {
    try
    {
      // Відкрити підключення
      connection.Open();
      label1.Text = "Connection is open. ";
      label2.Text = "Database: " + connection.Database;
      label3.Text = "DataSource: " + connection.DataSource;
    }
    catch(SqlException e)
    {
      label1.Text = e.Message;
    }
    finally
    {
      // Закрити підключення
      connection.Close();
      label1.Text = label1.Text + "Connection is closed...";
    }
  }
}

Принцип роботи наступний:

  • відкрити з’єднання з базою даних;
  • виконати операції над базою даних;
  • закрити з’єднання.

 

4.2. Прочитати дані з бази даних

Нижченаведений фрагмент демонструє читання даних з таблиці Table1 бази даних з іменем Database4 на основі:

  • рядка queryStr запиту на мові SQL (T-SQL);
  • рядка з’єднання з базою даних (Connection String).
private void GetDataFromDataBase()
{
  // Читає дані з бази даних
  // 1. Рядок запиту
  string queryStr = "SELECT * FROM [dbo].[Table1]";

  // 2. Рядок підключення
  string connStr = @"Data Source=(localdb)\ProjectModels;" +
      "Initial Catalog=Database4;Integrated Security=True;";

  // 3. Отримати дані
  using (SqlConnection connection =
    new SqlConnection(connStr))
  {
    try
    {
      // створити команду на мові SQL
      DbCommand command = connection.CreateCommand();
      command.CommandText = queryStr;
      command.CommandType = CommandType.Text;

      // Відкрити з'єднання
      connection.Open();

      // Отримати дані - клас DDataReader
      DbDataReader dataReader = command.ExecuteReader();

      // Вивести дані в listBox1
      listBox1.Items.Clear();
      while (dataReader.Read())
      {
        listBox1.Items.Add(dataReader[0].ToString() + " - " +
          dataReader[1].ToString());
      }
    }
    catch (Exception e)
    {
      MessageBox.Show(e.Message);
    }
    finally
    {
      // Закрити з'єднання
      connection.Close();
    }
  }
}

 

4.3. Отримати інформацію про з’єднання

Щоб отримати інформацію про з’єднання можна використати приблизно наступний код. В іншому випадку можна змінити тільки рядок з’єднання з базою даних connStr.

// Отримати інформацію про з'єднання
private void GetInformationAboutConnection()
{
  // 1. Сформувати рядок підключення
  string connStr = @"Data Source=(localdb)\ProjectModels;" +
      "Initial Catalog=Database4;Integrated Security=True;";

  // 2. Отримати інформацію
  using (SqlConnection connection =
    new SqlConnection(connStr))
  {
    try
    {
      // Відкрити підключення
      connection.Open();

      listBox1.Items.Add("Connection is open...");
      listBox1.Items.Add("Database: " + connection.Database);
      listBox1.Items.Add("DataSource: " + connection.DataSource);
      listBox1.Items.Add("State: " + connection.State.ToString());
      listBox1.Items.Add("Server Version: " + connection.ServerVersion);
      listBox1.Items.Add("Access Token: " + connection.AccessToken);
    }
    catch (SqlException e)
    {
      MessageBox.Show(e.Message);
    }
    finally
    {
      // Закрити підключення
      connection.Close();
      label1.Text = "Connection is closed...";
    }
  }
}

 

5. Приклад визначення провайдера та доступу до джерела даних

Приклад обробника події для додатку типу Windows Forms в якому вибирається підключення і встановлюється відповідне з’єднання в приєднаному режимі (connected mode).

// Приклад визначення провайдера з метою доступу до джерела даних
private void button5_Click(object sender, EventArgs e)
{
  IDbConnection conn = null;

  // Взяти виділений елемент
  int index = comboBox1.SelectedIndex;

  // Отримати ім'я провайдера
  string provider = comboBox1.Text;

  // Створити з'єднання
  if (provider == "SqlServer")
  {
    conn = new SqlConnection();
  }
  else
  if (provider == "OleDb")
  {
    conn = new OleDbConnection();
  }
  else
  if (provider == "Odbc")
  {
    conn = new OdbcConnection();
  }

  if (provider == "None")
  {
    return;
  }

  string info = conn.GetType().Name;
  listBox1.Items.Clear();
  listBox1.Items.Add(info);
}

 


Споріднені теми