C#. ADO .NET. Класс DbDataReader

Присоединенный режим (connected mode). Класс DbDataReader


Поиск на других ресурсах:

 


Содержание


1. Назначение класса DbDataReader

Класс DbDataReader предоставляет в использование средства чтения данных в подключенном режиме. Объект класса DbDataReader предназначен для чтения записей (строк) из таблицы базы данных. Чтение осуществляется в момент открытия соединения с базой данных. Класс реализует однонаправленное последовательное чтение. По сравнению с объектом типа DataSet, данный класс обеспечивает лучшую производительность при доступе к данным за счет снижения накладных расходов.

Объект DataReader не подходит для оперирования данными между разными уровнями приложения, поскольку при подключении этого объекта соединение остается открытым.

 

2. Методы и свойства класса

При чтении данных класс DataReader использует ряд параметров и способов.

Свойства класса DataReader приведены ниже.

Свойство Тип данных Объяснение
Depth Int32 Определяет степень вложенности текущей строки. Доступно только для чтения
FieldCount Int32 Количество полей в объекте DataReader. Доступно только для чтения
HasRows Boolean Указывает, вернул ли запрос DbCommand записи. Доступно только для чтения
IsClosed Boolean Указывает, закрыт ли объект DataReader. Только для чтения
Item Object Возвращает содержимое каждого поля текущей записи. Только для чтения
RecordAffected Int32 Указывает количество записей, задействованных выполненными запросами. Это свойство только для чтения

Методы класса DbDataReader следующие.

Метод Объяснение
Close Закрывает объект DbDataReader

Get<DataType>

GetString,

GetInt32,

GetDouble,

Возвращает содержимое заданного поля текущей строки на основе порядкового номера этого поля. В методе задается тип указанного поля

string strStudentName;
SqlDataReader rdr;

...

strStudentName = rdr.GetString(intStudentNameIndex);

или

strStudentName = (string)rdr.GetValue(intStudentNameIndex);
GetBytes Возвращает из указанного поля текущей записи массив байт
GetChars Возвращает из указанного поля текущей записи массив символов
GetData Возвращает новый объект DbDataReader на основе заданного поля
GetDataTypeName Возвращает название типа данных поля на основе порядкового номера поля в записи
GetFieldType Возвращает тип данных поля по порядковому номеру поля
GetName Возвращает имя поля по его порядковому номеру
GetOrdinal Возвращает порядковый номер поля на основе его имени
GetValue Возвращает значение поля по его порядковому номеру как тип данных .NET
GetValues Принимает массив, посредством которого объект типа DbDataReader возвращает содержимое текущего столбца. При вызове возвращает 32-битное целое число, что соответствует количеству записей в массиве

SqlDataReader rdr = command.ExecuteReader();
object[] aData = new object[rdr.FileCount];
while (rdr.Read())
{
  rdr.GetValues(aData);
  Console.WriteLine(aData[0].ToString());
}
IsDbNull Указывает, содержит ли поле значение Null
NextResult Используется в случаях, когда есть пакетный запрос, возвращающий несколько наборов результатов. Метод реализует переход к следующему набору результатов
Read Осуществляет переход к следующей записи

Объект типа DataReader может получать данные из различных источников, включая SQL-запрос, содержащийся в объекте типа Command (DbCommand, SqlCommand, OledbCommand, OdbcCommand). После получения данных существует возможность отменить считывание данных с помощью метода Cancel().

 

3. Пример получения данных

В примере продемонстрировано чтение данных из базы данных с именем MyDatabase. В базе данных создана таблица с именем Table1, которая имеет структуру с данными, состоящую из 3-х столбцов.

Столбцы таблицы имеют следующее назначение

  • Id – уникальный идентификатор, автоинкрементное поле;
  • Name – фамилия и имя студента;
  • Address – адрес студента.

Строки таблицы заполнены значениями, как показано в таблице.

Id Name Address
1 Student1 Address-01
2 Student2 Address-02
3 Student3 Address-03

Для вывода всех строк и столбцов таблицы в компоненте ListBox для приложения типа Windows Forms можно использовать, например, такой код.

private void GetDataFromDataBase()
{
  // Чтение данных из базы данных
  // 1. Строка запроса
  string queryStr = "SELECT * FROM [dbo].[Table1]";

  // 2. Строка подключения
  string connStr = @"Data Source=(localdb)\ProjectModels;" +
    "Initial Catalog=MyDatabase;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();

      // Получить данные - класс DbDataReader
      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. Метод GetName(). Поле FieldCount. Получить имя столбца в таблице

Чтобы получить имя поля из таблицы базы данных, нужно использовать метод GetName(). Соответственно количество полей таблицы определяется с помощью свойства FieldCount, которое доступно только для чтения.

Например, для следующей таблицы

Id Name Address

вызов метода из объекта DataReader с именем dataReader

dataReader.GetName(0);

вернет строку «Id».

А вызов

dataReader.GetName(2);

вернет строку «Address».

В следующем примере приводится фрагмент кода, выводящий имена всех полей таблицы с именем Table1 базы данных MyDatabase. Поля отображаются в компоненте ListBox. Пример реализован для приложения типа Windows Forms.

private void button7_Click(object sender, EventArgs e)
{
  // Получить перечень имен полей на основании результата SQL-запроса и добавить их в ListBox
  // 1. Строка подключения
  string connStr = @"Data Source=(localdb)\ProjectModels;" +
    "Initial Catalog=MyDatabase;Integrated Security=True;";

  // 2. Текст SQL-запроса
  string strSQL = "SELECT * FROM [dbo].[Table1]";

  // 3. Подключиться к базе данных и получить данные
  using (SqlConnection connection =
    new SqlConnection(connStr))
  {
    try
    {
      // создать команду на языке SQL
      DbCommand command = connection.CreateCommand();
      command.CommandText = strSQL;
      command.CommandType = CommandType.Text;

      // Открыть соединения
      connection.Open();

      // Получить данные - класс DbDataReader
      DbDataReader dataReader = command.ExecuteReader();

      // Вывести имена столбцов таблицы в listBox1
      listBox1.Items.Clear();

      // FieldCount - количество столбцов в таблице, из которой считываются данные
      for (int i = 0; i < dataReader.FieldCount; i++) // перебрать все поля
      {
        // Получить имя поля
        string s = dataReader.GetName(i);

        // Вывести имя поля в ListBox
        listBox1.Items.Add(s);
      }

      // Закрыть объект dataReader
      dataReader.Close();
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message);
    }
    finally
    {
      // Закрыть соединение
      connection.Close();
    }
  }
}

 

5. Метод GetFieldType(). Получить название типа данных поля (столбца) на основе его порядкового номера (0, 1, 2, …) как типа .NET

Метод GetFieldType() возвращает экземпляр типа Type с заполненными данными о типе поля. Общая форма объявления метода следующая

Type DbDataReader.GetFieldType(int ordinal);

здесь

  • ordinal – порядковый номер столбца (поля) в таблице, содержащей строки, представленные объектом DataReader.

Нижеследующий пример демонстрирует чтение типов данных всех полей заданной таблицы.

private void button8_Click(object sender, EventArgs e)
{
  // Получить название типа данных поля
  // 1. Строка подключения
  string connStr = @"Data Source=(localdb)\ProjectModels;" +
    "Initial Catalog=MyDatabase;Integrated Security=True;";

  // 2. Текст SQL-запроса
  string strSQL = "SELECT * FROM [dbo].[Table1]";

  // 3. Подключиться к базе данных и получить данные
  using (SqlConnection connection =
    new SqlConnection(connStr))
  {
    try
    {
      // Создать команду на языке SQL
      DbCommand command = connection.CreateCommand();
      command.CommandText = strSQL;
      command.CommandType = CommandType.Text;

      // Открыть соединение
      connection.Open();

      // Получить данные - класс DbDataReader
      DbDataReader dataReader = command.ExecuteReader();

      // Вывести имена типов данных столбцов таблицы в listBox1
      listBox1.Items.Clear();

      // FieldCount - количество столбцов в таблице, из которой считываются данные
      for (int i = 0; i < dataReader.FieldCount; i++) // перебрать все поля
      {
        // Получить имя поля
        string s = dataReader.GetFieldType(i).Name;

        // Вывести имя поля в ListBox
        listBox1.Items.Add(s);
      }

      // Закрыть объект dataReader
      dataReader.Close();
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message);
    }
    finally
    {
      // Закрыть соединение
      connection.Close();
    }
  }
}

Для таблицы, представленной в п.п. 3-4 результатом добавления полей в ListBox являются строки

Int32
String
String

 

6. Метод GetDataTypeName(). Получить название типа данных в базе данных на основе порядкового номера (0, 1, 2, …)

Общая форма объявления метода GetDataTypeName() имеет вид:

string GetDataTypeName(int ordinal);

Фрагмент, читающий список типов данных с объекта dataReader типа DbDataReader и записывающий их в компонент ListBox (приложение типа Windows Forms).

...

// Вывести имена типов данных столбцов таблицы в listBox1
listBox1.Items.Clear();

// FieldCount - количество столбцов в таблице, из которой считываются данные
for (int i = 0; i < dataReader.FieldCount; i++) // перебор всех полей
{
  // Получить имя поля
  string s = dataReader.GetDataTypeName(i);
  listBox1.Items.Add(s);
}

...

Для таблицы данных из пунктов 3, 4 результатом программы будет

int
nchar
nchar

 


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