ExecuteNonQuery

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

Данный метод рекомендуется использовать для выполнения следующих SQL-запросов:

  • относящихся к операторам определения данных: создание/удаление/модификация объектов БД – таблиц, представлений, пользователей и т.п.;

  • относящихся к операторам манипулирования данными – вставка/удаление/модификация записей;

  • вызов хранимых процедур, не возвращающих данные;

  • возвращающих не обрабатываемую клиентским приложением выборку данных.

Хотя метод ExecuteNonQuery и не возвращает ни одной строки, выходные параметры хранимых процедур заполняются данными.

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

Для запросов UPDATE, INSERT и DELETE возвращается количество строк, которые реально были обработаны с их помощью. Для всех прочих типов запросов возвращается -1.

Исключения
InvalidOperationException

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

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

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

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

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

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

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

    // C#
    using System;
    using System.Data;
    using System.Data.Common;
    
    class ExecuteNonQuerySample
    {
      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 = "delete from auto where personid=1001";
        // Выполнение SQL-запроса
        int rowsDeleted = cmd.ExecuteNonQuery();
        if (rowsDeleted  > 0)
        {
          Console.WriteLine("Запись о пользователе с id=1001 удалена");
        }
        else
        {
          Console.WriteLine("Пользователь с id=1001 не найден");
        }
        // Освобождение ресурсов
        cmd.Dispose();
        con.Dispose();
      }
    }
  2. Выполнение хранимой процедуры с выходным параметром

    Примечание

    В текущей версии ADO.NET провайдера параметры в команду надо добавлять в том порядке, в котором они идут в предложении CREATE PROCEDURE.

    // В данном примере создается хранимая процедура PROC1, которая имеет
    // два входных параметра A и B типа REAL и
    // один выходной параметр C типа VARCHAR(50).
    // В выходной параметр записывается результат деления A / B.
    // Если B = 0, то в выходной параметр записывается значение NULL.
    // C#
    using System;
    using System.Data;
    using System.Data.LinterClient;
    
    class ExecuteNonQuerySample
    {
      static void Main()
      {
        LinterDbConnection connection = null;
    
        try
        {
          // Создание объекта соединение
          connection = new LinterDbConnection("UserID=SYSTEM;Password=MANAGER8");
    
          // Создание объекта команда
          LinterDbCommand command = new LinterDbCommand();
          command.Connection = connection;
          command.CommandText =
          @"
    create or replace procedure proc1(
      in a real;
      in b real;
      out c varchar(50))
    code
      if b = 0 then
        c := NULL;
      else
        c := ""Результат деления a/b: "" + ftoa(a/b);
      endif
    end;";
    
          // Открытие соединения
          connection.Open();
    
          // Создание хранимой процедуры
          command.ExecuteNonQuery();
    
          // Настройка команды для выполнения хранимой процедуры
          command.CommandText = "proc1";
          command.CommandType = CommandType.StoredProcedure;
    
          // Создание параметров
    
          LinterDbParameter a = command.CreateParameter();
          a.LinterDbType = ELinterDbType.Real;
          a.Direction = ParameterDirection.Input;
          a.ParameterName = "a";
    
          LinterDbParameter b = command.CreateParameter();
          b.LinterDbType = ELinterDbType.Real;
          b.Direction = ParameterDirection.Input;
          b.ParameterName = "b";
    
          LinterDbParameter c = command.CreateParameter();
          c.LinterDbType = ELinterDbType.VarChar;
          c.Size = 50;
          c.Direction = ParameterDirection.Output;
          c.ParameterName = "c";
    
          // Добавление параметров в коллекцию параметров команды
          command.Parameters.Add(a);
          command.Parameters.Add(b);
          command.Parameters.Add(c);
    
          // Трансляция запроса
          command.Prepare();
    
          // Установка значений входных параметров
          a.Value = 5;
          b.Value = 2;
    
          // Выполнение хранимой процедуры
          command.ExecuteNonQuery();
    
          // Вывод на экран значения выходного параметра
          Console.WriteLine(Convert.IsDBNull(c.Value) ? "< NULL >" : c.Value);
    
          // Установка других значений входных параметров
          a.Value = 1;
          b.Value = 0;
    
          // Выполнение хранимой процедуры с новыми значениями входных параметров
          command.ExecuteNonQuery();
    
          // Вывод на экран нового значения выходного параметра
          Console.WriteLine(Convert.IsDBNull(c.Value) ? "< NULL >" : c.Value);
        }
        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 (connection != null)
          {
            connection.Close();
          }
        }
      }
    }
    Результат выполнения примера:
    Результат деления a/b: 2.5
    < NULL >
    Освобождение ресурсов.
  3. Выполнение группы запросов, разделенных знаком «;»

    // C#
    using System;
    using System.Data;
    using System.Data.LinterClient;
    
    class ExecuteNonQuerySample
    {
      static void Main()
      {
        LinterDbConnection con = null;
        LinterDbDataReader reader = null;
    
        try
        {
          // Создание объекта соединение
          con = new LinterDbConnection("UserID=SYSTEM;Password=MANAGER8");
    
          // Создание объекта команда
          LinterDbCommand cmd = new LinterDbCommand();
          cmd.Connection = con;
          cmd.CommandText =
            "create or replace table tab1(c1 char(10), c2 char(10))";
    
          // Открытие соединения
          con.Open();
    
          // Создание таблицы в базе данных
          cmd.ExecuteNonQuery();
    
          // Формирование группы запросов, разделенных знаком “;”
          cmd.CommandText =
            "insert into tab1 (c1, c2) values ('AAA', :p1);" +
            "insert into tab1 (c1, c2) values ('BBB', :p2)";
    
          // Создание параметров
          LinterDbParameter p1 = cmd.CreateParameter();
          p1.LinterDbType = ELinterDbType.Char;
          p1.Size = 10;
          p1.ParameterName = "p1";
    
          LinterDbParameter p2 = cmd.CreateParameter();
          p2.LinterDbType = ELinterDbType.Char;
          p2.Size = 10;
          p2.ParameterName = "p2";
    
          // Добавление параметров в коллекцию параметров команды
          cmd.Parameters.Add(p1);
          cmd.Parameters.Add(p2);
    
          // Трансляция запроса
          cmd.Prepare();
    
          // Установка значений параметров
          p1.Value = "PPP1";
          p2.Value = "PPP2";
    
          // Выполнение запроса
          cmd.ExecuteNonQuery();
    
          // Формирование SQL-запроса для чтения данных из таблицы
          cmd.CommandText = "select c1, c2 from tab1";
    
          // Выполнение запроса чтения данных из таблицы
          reader = cmd.ExecuteReader();
    
          // Чтение данных из таблицы
          while (reader.Read())
          {
            Console.WriteLine(reader[0] + " | " + reader[1]);
          }
        }
        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 (con != null)
          {
            con.Close();
          }
        }
      }
    }
    Результат выполнения примера:
    AAA        | PPP1
    BBB        | PPP2
    Освобождение ресурсов.