ExecuteReader

Метод выполняет свойство CommandText по соединению Connection и помещает результаты (обычно выборку данных) в объект DbDataReader (работа с объектом DbDataReader описана в подразделе Класс DbDataReader).

Примечание

В случае группы запросов, разделенных знаком «;», метод ExecuteReader возвращает объект DbDataReader для первого возвращающего данные запроса.

Если в свойстве CommandType указано, что будет выполняться хранимая процедура, то в свойстве CommandText должно быть указано имя этой процедуры. Метод ExecuteReader выполняет указанную процедуру, при этом если процедура возвращает курсор, то полученный объект DbDataReader можно использовать для чтения данных курсора.

Синтаксис
public DbDataReader ExecuteReader();
Возвращаемое значение

Результирующая выборка данных в виде объекта System.Data.Common.DbDataReader.

Примечание

Количество записей в полученной выборке узнать нельзя.

Исключения
InvalidOperationException

Возможные причины:

  • текст команды не установлен;

  • команда не связана с соединением;

  • соединение не открыто;

  • команда не связана с транзакцией, открытой по соединению;

  • команда связана с открытым объектом DataReader.

Exception Для входного параметра не установлено значение или для параметра длиной больше 4000 байт не установлен тип BLOB.
LinterSqlException Код завершения СУБД ЛИНТЕР не равен 0.
Пример
  1. Выполнение SELECT-запроса

    // C#
    using System;
    using System.Data;
    using System.Data.Common;
    
    class ExecuteReaderSample
    {
      static void Main()
      {
        // Создание фабрики классов провайдера
        DbProviderFactory factory =
          DbProviderFactories.GetFactory("System.Data.LinterClient");
        // Соединение с БД
        DbConnection con = factory.CreateConnection();
        con.ConnectionString = "User ID=SYSTEM;Password=MANAGER8;Data Source=LOCAL";
        con.Open();
        // Создание объекта DbCommand
        DbCommand cmd = factory.CreateCommand();
        cmd.Connection = con;
        // Формирование текста SQL-запроса
        cmd.CommandText = "select distinct model, make from auto";
        // Выполнение SQL-запроса
        DbDataReader reader = cmd.ExecuteReader();
        // Обработка результатов запроса
        while (reader.Read())
        {
          Console.WriteLine("Марка автомобиля : " + reader.GetString(0) +
            " Производитель : " + reader.GetString(1));
        }
        // Освобождение ресурсов
        reader.Dispose();
        cmd.Dispose();
        con.Dispose();
      }
    }
  2. Выполнение процедуры с курсором

    // В данном примере происходит выполнение временной хранимой процедуры, которая
    // создаётся, компилируется и выполняется за один шаг, поэтому для её работы
    // отпадает необходимость создания объекта БД «процедура» и наличие в БД системных
    // таблиц $$$PROC и $$$PRCD. Для создания и выполнения временной хранимой
    // процедуры используется оператор EXECUTE BLOCK.
    // C#
    using System;
    using System.Data;
    using System.Data.LinterClient;
    
    class ExecuteBlockSample
    {
      static void Main()
      {
        LinterDbConnection connection = null;
        LinterDbDataReader reader = null;
    
        try
        {
          // Создание объекта соединение
          connection = new LinterDbConnection("UserID=SYSTEM;Password=MANAGER8");
    
          // Создание объекта команда
          LinterDbCommand command = new LinterDbCommand();
          command.Connection = connection;
          command.CommandText =
          @"
    execute block result cursor(MAKE char(20), MODEL char(20), BODYTYPE char(15))
    declare
     var a typeof(result);
    code
     open a for ""select MAKE, MODEL, BODYTYPE from AUTO fetch first 3;"";
     return a;
    end;";
    
          // Открытие соединения
          connection.Open();
    
          Console.WriteLine("Выполнение команды...");
          // Выполнение временной хранимой процедуры, возвращающей курсор
          reader = command.ExecuteReader();
    
          Console.WriteLine("Результат выполнения запроса: ");
          // Получение данных из курсора
          while (reader.Read())
          {
            Console.WriteLine(reader[0] + " | " + reader[1] + " | " + reader[2]);
          }
          Console.WriteLine("Выполнение команды завершено.");
        }
        catch (LinterSqlException ex)
        {
          // Обработка исключений СУБД ЛИНТЕР
          Console.WriteLine(
            "Исключение ядра СУБД ЛИНТЕР \n" +
            "Текст сообщения: " + ex.Message + "\n" +
            "Код СУБД ЛИНТЕР: " + ex.Number + "\n" +
            "Код операционной системы: " + ex.LinterSysErrorCode + "\n");
        }
        catch (Exception ex)
        {
          // Обработка исключений других типов
          Console.WriteLine(
            "Исключение ADO.NET провайдера \n" +
            "Тип ошибки: " + ex.GetType() + "\n" +
            "Сообщение: " + ex.Message + "\n");
        }
        finally
        {
          // Освобождение ресурсов
          Console.WriteLine("Освобождение ресурсов.");
          if (reader != null)
          {
            reader.Close();
          }
          if (connection != null)
          {
            connection.Close();
          }
        }
      }
    }
    Результат выполнения примера:
    Выполнение команды...
    Результат выполнения запроса:
    FORD                 | MERCURY COMET GT V8  | COUPE
    ALPINE               | A-310                | COUPE
    AMERICAN MOTORS      | MATADOR STATION      | STATION WAGON
    Выполнение команды завершено.
    Освобождение ресурсов.