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