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

 


Связанные темы