ExecuteMethodCall(LinterDataContext, MethodInfo, object[])

Позволяет выполнить хранимую процедуру в классах-наследниках.

Синтаксис
protected internal IExecuteResult ExecuteMethodCall(LinterDataContext context, MethodInfo methodInfo, object[] parameters);

context – текущий контекст, который надо использовать;

methodInfo – атрибуты и метаданные текущего метода;

parameters – значения параметров хранимой процедуры.

Возвращаемое значение

Объект типа IExecuteResult, представляющий результат выполнения хранимой процедуры.

Исключения
ObjectDisposedException Объект LinterDataContext освобождён методом Dispose().
ArgumentNullException Значение parameters равно null.
InvalidOperationException Текущий метод не отмечен атрибутом [Function] или количество параметров текущего метода не равно количеству элементов массива parameters.
NotSupportedException Тип возвращаемого значения текущего метода не поддерживается.
LinterSqlException Код завершения СУБД ЛИНТЕР не равен 0.
Пример

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

// В примере создаётся класс Auto, который отображается на
// таблицу AUTO в демонстрационной БД. Для выполнения хранимой
// процедуры создаётся контекст StoredProcedureContext,
// унаследованный от контекста LinterDataContext.
// В контексте StoredProcedureContext создаётся метод
// SelectAuto, который отображается на хранимую процедуру
// SELECT_AUTO и возвращает коллекцию объектов типа Auto,
// имеющих заданный идентификатор.
// C#
using System;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Linter;
using System.Data.Linq.Mapping;
using System.Collections.Generic;
using System.Reflection;

// Класс Auto отображается на таблицу AUTO
[Table(Name = "AUTO")]
class Auto
{
  // Свойство Make отображается на поле MAKE
  [Column(Name = "MAKE")]
  public string Make { get; set; }

  // Свойство Model отображается на поле MODEL
  [Column(Name = "MODEL")]
  public string Model { get; set; }

  // Свойство PersonId отображается на поле PERSONID
  [Column(Name = "PERSONID", IsPrimaryKey = true)]
  public int PersonId { get; set; }
}

// Контекст предназначен для выполнения хранимой процедуры
class StoredProcedureContext : LinterDataContext
{
  public StoredProcedureContext(string connectionString)
    : base(connectionString)
  {
  }

  // Возвращает коллекцию автомобилей по указанному идентификатору
  [Function(Name = "SELECT_AUTO")]
  public IEnumerable< Auto > SelectAuto(int personId)
  {
    var mi = (MethodInfo)(MethodBase.GetCurrentMethod());
    using (var result = ExecuteMethodCall(this, mi, new object[] { personId }))
    {
      return (IEnumerable< Auto >)result.ReturnValue;
    }
  }
}

class ExecuteMethodCallSample
{
  static void Main()
  {
    // Формирование строки соединения
    var connectionStr = "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";

    // Создание контекста для выполнения хранимой процедуры
    using (var context = new StoredProcedureContext(connectionStr))
    {
      // Формирование запроса
      var personId = 1;
      var query = context.SelectAuto(personId);

      // Выполнение хранимой процедуры и получение коллекции объектов
      foreach (var auto in query)
      {
        // Отображение свойств объекта на экране
        Console.WriteLine(auto.Make + " | " + auto.Model + " | " + auto.PersonId);
      }
    }
  }
}
Для работы примера надо создать хранимую процедуру:
create or replace procedure SELECT_AUTO(
  in PERSONID int)
result
  cursor(MAKE char(20), MODEL char(20), PERSONID int)
declare
  var a typeof(result);
code
  open a for direct "select MAKE, MODEL, PERSONID " +
    "from SYSTEM.AUTO where PERSONID = ?" using PERSONID;
  return a;
end;

Результат выполнения примера:

FORD                 | MERCURY COMET GT V8  | 1

2) Пример выполнения хранимой процедуры, которая возвращает скалярное значение и имеет выходной параметр.

// В примере создаётся класс Auto, который отображается на
// таблицу AUTO в демонстрационной БД. Для выполнения хранимой
// процедуры создаётся контекст StoredProcedureContext,
// унаследованный от контекста LinterDataContext.
// В контексте StoredProcedureContext создаётся метод
// GetMakeModel, который отображается на хранимую процедуру
// GET_MAKE_MODEL и возвращает марку и модель авто,
// имеющего заданный идентификатор.
// C#
using System;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Linter;
using System.Data.Linq.Mapping;
using System.Reflection;

// Класс Auto отображается на таблицу AUTO
[Table(Name = "AUTO")]
class Auto
{
  // Свойство Make отображается на поле MAKE
  [Column(Name = "MAKE")]
  public string Make { get; set; }

  // Свойство Model отображается на поле MODEL
  [Column(Name = "MODEL")]
  public string Model { get; set; }

  // Свойство PersonId отображается на поле PERSONID
  [Column(Name = "PERSONID", IsPrimaryKey = true)]
  public int PersonId { get; set; }
}

// Контекст предназначен для выполнения хранимой процедуры
class StoredProcedureContext : LinterDataContext
{
  public StoredProcedureContext(string connectionString)
    : base(connectionString)
  {
  }

  // Возвращает марку и модель автомобиля по указанному идентификатору
  [Function(Name = "GET_MAKE_MODEL")]
  public string GetMakeModel(int personId, ref string model)
  {
    var mi = (MethodInfo)(MethodBase.GetCurrentMethod());
    using (var result = ExecuteMethodCall(this, mi, new object[] { personId, model }))
    {
      model = (string)result.GetParameterValue(1);
      return (string)result.ReturnValue;
    }
  }
}

class ExecuteMethodCallSample
{
  static void Main()
  {
    // Формирование строки соединения
    var connectionStr = "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";

    // Создание контекста для выполнения хранимой процедуры
    using (var context = new StoredProcedureContext(connectionStr))
    {
      // Выполнение хранимой процедуры
      var personId = 1;
      string model = null;
      var make = context.GetMakeModel(personId, ref model);

      // Отображение данных на экране
      Console.WriteLine("Марка авто: " + make);
      Console.WriteLine("Модель авто: " + model);
      Console.WriteLine("Идентификатор: " + personId);
    }
  }
}

Для работы примера надо создать хранимую процедуру:

create or replace procedure GET_MAKE_MODEL(
  in PERSONID int; out MODEL char(20))
result
  char(20)
declare
  var a char(20);
  var b char(20);
code
  execute direct "select MAKE, MODEL from SYSTEM.AUTO" +
    " where PERSONID = ?" using PERSONID into a, b;
  MODEL := b;
  return a;
end;

Результат выполнения примера:

Марка авто: FORD
Модель авто: MERCURY COMET GT V8
Идентификатор: 1