Присоединенный режим (connected mode). Класс DbDataReader
Поиск на других ресурсах:
Содержание
- 1. Назначение класса DbDataReader
- 2. Методы и свойства класса
- 3. Пример получения данных
- 4. Метод GetName(). Поле FieldCount. Получить имя столбца в таблице
- 5. Метод GetFieldType(). Получить название типа данных поля (столбца) на основе его порядкового номера (0, 1, 2, …) как типа .NET
- 6. Метод GetDataTypeName(). Получить название типа данных в базе данных на основе порядкового номера (0, 1, 2, …)
- Связанные темы
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
⇑
Связанные темы
⇑