C#. ADO .NET. Клас DbCommand. Приклади

Клас DbCommand. Приклади використання

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


Пошук на інших ресурсах:

Зміст


1. Мета та задачі класу DbCommand

Клас DbCommand використовується з метою створення об’єкту який інкапсулює в собі SQL-запит. Сформований в об’єкті SQL-запит може задаватись до існуючого з’єднання з базовю даних в приєднаному режимі (connected mode).

Для створення об’єкту типу DbCommand чи успадкованого з нього типу (SqlCommand, OledbCommand, OdbcCommand) потрібно викликати конструктор SqlCommand(), який отримує 2 параметри:

  • об’єкт типу DbConnection – реалізує безпосередньо з’єднання з базою даних;
  • рядок на мові SQL, який    буде задаватись до об’єкту DbConnection.

 

2.Властивості та методи класу DbCommand
2.1. Властивості класу DbCommand (на прикладі класу SqlCommand)

 

Властивість Тип даних Пояснення
CommandText string Містить текст запиту на мові SQL
CommandTimeOut Int32 Час в секундах. Це є час очікування адаптером завершення виконання запиту (за замовчуванням 30 секунд)
CommandType CommandType Тип запиту (за замовчуванням Text). Також є TableDirect та StoredProcedure
Connection SqlConnection З’єднання зі сховищем даних
Parameters SqlParameterCollection Набір параметрів запиту
Transaction SqlTransaction Задає транзакцію, що використовується для запиту

 

2.2. Методи класу DbCommand

 

Метод Пояснення

BeginExecuteNonQuery,

BeginExecuteReader,

BeginExecuteXmlReader

Починає асинхронне виконання запиту
Cancel Відміняє виконання запиту
Clone Повертає копію об’єкту DbCommand (SqlCommand)
CreateParameter Створює новий параметр для запиту

EndExecuteNonQuery,

EndExecuteReader,

EndExecuteXmlReader

Завершує асинхронне виконання запиту
ExecuteNonQuery Виконує запит на мові SQL, який не повертає записів.
ExecuteReader Виконує запит на мові SQL, який повертає записи. Результат вставляється в об’єкт DbDataReader (SqlDataReader).
Prepare Зберігає у сховищі даних підготовлену версію запиту
ResetCommandTimeout Встановлює у властивості CommandTimeout значення за замовчуванням (30 секунд).

 

2.3. Приклад посилання запиту

У прикладі наведено фрагмент програмного коду, який виводить всі поля таблиці Group, яка складається з двох полів:

  • ID_Group – унікальний ідентифікатор групи, первинний ключ;
  • NameGroup – ім’я групи.

У фрагменті коду підключення відбувається до провайдера Microsoft SQL Server.

string connString =
  @"DataSource = .SQLExpress;" +
  "InitialCatalog = MyDatabase;" +
  "Integrated Security = True";
string strSQL = "SELECT * FROM [Group]";

SqlConnection conn = new SqlConnection(connString);

// Відкрити з'єднання з базою даних
conn.Open();
SqlCommand command = new SqlCommand(strSQL, conn);
SqlDataReader reader = command.ExecuteReader();
int RowsRetrieved = 0; // Кількість прочитаних рядків

// Щоб відмінити запит потрібно викликати command.Cancel();
while (reader.Read())
{
  listBox1.Items.Add(reader[0].toString() +
    " - " +
    reader[1].toString());
  RowsRetrieved++;
}

label2.Text = "Number rows retrieved: " + RowsRetrieved.toString();

// Закрити об'єкт reader
reader.Close();
conn.Close();


У вищенаведеному фрагменті з допомогою конструктора SqlCommand() створюється об’єкт, що інкапсулює в собі SQL-команду. Це здійснюєтья з допомогою рядка

SqlCommand command = new SqlCommand(strSQL, conn);

в якому

  • strSQL – текст запиту на мові SQL (T-SQL);
  • conn – об’єкт типу SqlConnection, який забезпечує підключення до бази даних.

Для отримання результуючого набору рядків на основі запиту command використовується об’єкт reader типу SqlDataReader. Об’єкт reader є колекцією стовпців таблиці, яка формується на основі заданого SQL-запиту. Щоб отримати об’єкт reader з заповненими даними у вигляді таблиці викликається метод ExecuteReader() об’єкту command

SqlDataReader reader = command.ExecuteReader();

На основі запиту, що сформований в об’єкті command формується об’єкт reader. Цей об’єкт є колекцією стовпців вихідної таблиці. Ця таблиця створюється на основі SQL-запиту, сформованого в об’єкті command. Тому, до полів таблиці в об’єкті reader можна звертатись з допомогою операції індексування:

  • reader[0] – стовпець таблиці з індексом 0
  • reader[1] – стовпець таблиці з індексом 1

Для кожного стовпця (reader[0], reader[1], …) можна виконати приведення до типу цього стовпця і, таким чином, отримати коректне представлення даних у нашій програмі.

В об’єкті reader реалізовано метод Read(), який читає рядки в одному напрямку (з початку до кінця). Якщо рядок може бути прочитаний, то метод Read() повертає true. Тому, при читанні рядків, доцільно поміщати цей метод в цикл while()

while (reader.Read())
{
  ...
}

З допомогою введення додаткової змінної можна підрахувати кількість рядків в об’єкті reader, що були отримані в результаті запиту command.

 

3. Приклад читання даних з бази даних та додавання цих даних в компонент типу ListBox. Додаток типу Windows Forms

У прикладі наводиться обробник події в додатку типу Windows Forms, в якому з бази даних зчитуються дані та записуються для відтворення у компоненті ListBox.

Для того, щоб отримати працездатний код для свого випадку таблиці бази даних, достатньо вказати (змінити):

  •  текст SQL-запиту;
  •  рядок Connection String з’єднання з базою даних.

Також, за власним бажанням можна змінити:

  •  компонент ListBox на будь-який інший компонент;
  •  формат представлення інформації.
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();
    }
  }
}

 


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