Небольшой обзор технологий я уже сделал в предыдущей статье, здесь я хотел бы показать как я реализовал свой подход:
Создание хранимых процедур
Справочник регионов.
Пакет:
create or replace package admin_REGION_V01 as
function f_sel_REGION return tab_select_REGION pipelined;
function f_upd_REGION(p_REGION_ID in NUMBER,
p_REGION_NAME in VARCHAR2) return varchar2;
function f_ins_REGION( p_REGION_NAME in VARCHAR2) return varchar2;
function f_del_REGION(p_REGION_ID in NUMBER) return varchar2;
end admin_REGION_V01;
Тело пакета:
create or replace package body admin_REGION_V01 as
function f_sel_REGION return tab_select_REGION pipelined
as
l_t_select_REGION t_select_REGION;
begin
l_t_select_REGION:= t_select_REGION(0,'');
for C in (select
REGION_ID,REGION_NAME
from REGION
)
loop
l_t_select_REGION.REGION_ID:= C.REGION_ID;
l_t_select_REGION.REGION_NAME:= C.REGION_NAME;
pipe row (l_t_select_REGION);
end loop;
return;
end f_sel_REGION;
function f_upd_REGION( p_REGION_ID in NUMBER,
p_REGION_NAME in VARCHAR2) return varchar2
as
pragma autonomous_transaction;
my_errm VARCHAR2(32000);
begin
update REGION
set REGION_NAME = p_REGION_NAME
where REGION_ID= p_REGION_ID;
commit;
return 'REGION:' || p_REGION_NAME ||' was success updated';
exception when others then
my_errm := SQLERRM;
rollback;
return my_errm;
end f_upd_REGION;
function f_ins_REGION( p_REGION_NAME in VARCHAR2) return varchar2
as
pragma autonomous_transaction;
my_errm VARCHAR2(32000);
begin
insert into REGION
(
REGION_ID,
REGION_NAME
)
values (
seq_groups_id.nextval,
p_REGION_NAME);
commit;
return 'REGION:' || p_REGION_NAME|| 'was success inserted';
exception when others then
my_errm := SQLERRM;
rollback;
return my_errm;
end f_ins_REGION;
function f_del_REGION(p_REGION_ID in NUMBER) return varchar2
as
pragma autonomous_transaction;
my_errm VARCHAR2(32000);
begin
delete from REGION
where REGION_ID =p_REGION_ID;
commit;
return 'REGION: '|| p_REGION_ID||' was success deleted';
exception when others then
my_errm := SQLERRM;
rollback;
return my_errm;
end f_del_REGION;
end admin_REGION_V01;
Тут собственно я обернул все необходимые DML для работы приложения с таблицей.
Дальше в ASP MVC делаем класс, фактически это все колонки Вашей таблицы:
namespace TEST.Models.OracleORM.classes
{
public class Region
{
public int RegionRegionId { set; get; }
public string RegionRegionName { set; get; }
public Region() { }
}
}
Далее ORM класс, который будет вызывать хранимые процедуры:
using System;
using System.Collections.Generic;
using COMMON.Oracle;
using Erequest3AdminTool.Models.OracleORM.classes;
namespace Erequest3AdminTool.Models.OracleORM
{
public class RegionIUDS
{
private static String RegionSelect = @" select region_id F01
,region_name F02
from table(admin_region_v01.f_sel_region())";
private static String RegionUpdate = @"select admin_region_v01.f_upd_region( p_REGION_ID => &p_REGION_ID
,p_REGION_NAME => '&p_REGION_NAME') results from dual";
private static String RegionInsert = @"select admin_region_v01.f_ins_region( p_REGION_NAME => '&p_REGION_NAME') results from dual";
private static String RegionDelete = @"select admin_region_v01.f_del_region(p_REGION_ID =>&p_REGION_ID ) results from dual";
public static List<Region> SelectRegion()
{
List<Region> result = new List<Region>();
try
{
foreach (OracleField row in OracleLib.setExecuteSelect(RegionSelect))
{
result.Add(new Region()
{
RegionRegionId = Convert.ToInt32(row.F01),
RegionRegionName = row.F02
});
}
}
catch
{
throw;
}
return result;
}
public static string UpdateRegion(Region Region)
{
string result = "";
try
{
String l_sql = RegionUpdate;
l_sql = l_sql.Replace("&p_REGION_ID", Convert.ToString(Region.RegionRegionId));
l_sql = l_sql.Replace("&p_REGION_NAME", Region.RegionRegionName);
result = OracleLib.setExecuteIUD(l_sql);
}
catch
{
throw;
}
return result;
}
public static string InsertRegion(Region Region)
{
string result = "";
try
{
String l_sql = RegionInsert;
l_sql = l_sql.Replace("&p_REGION_NAME", Region.RegionRegionName);
result = OracleLib.setExecuteIUD(l_sql);
}
catch
{
throw;
}
return result;
}
public static string DeleteRegion(int RegionRegionId)
{
string result = "";
try
{
String l_sql = RegionDelete;
l_sql = l_sql.Replace("&p_REGION_ID", Convert.ToString(RegionRegionId));
result = OracleLib.setExecuteIUD(l_sql);
}
catch
{
throw;
}
return result;
}
}
}
Смысл я думаю понятен, просто перезаписываем переменные какими-то значениями, которые передаются из контроллера.
Далее контроллер:
namespace Erequest3AdminTool.Controllers
{
public class RegionController : Controller
{
/// <summary>
/// Полная страница для отображения
/// </summary>
public ActionResult RegionShowPage()
{
return View("RegionTable");
}
/// <summary>
/// Передает список всех пользователей через JSON
/// </summary>
public ActionResult RegionSelect()
{
return Json(RegionIUDS.SelectRegion(), JsonRequestBehavior.AllowGet);
}
/// <summary>
/// Обновить данные о Region
/// </summary>
/// <param name="Region">JSON, содержит информацию для обновления</param>
[HttpPost]
public ActionResult RegionUpdate(Region Region)
{
try
{
if (ModelState.IsValid)
{
string results = RegionIUDS.UpdateRegion(Region);
if (results.Contains("ORA"))
{
return PartialView("~/Views/Shared/error.cshtml", results);
}
else
{
return PartialView("~/Views/Shared/done.cshtml", results);
}
}
else
{
return PartialView("~/Views/Shared/error.cshtml", "RegionUpdate invalid Model");
}
}
catch (Exception e)
{
return View("~/Views/Shared/error.cshtml", e.Message);
}
}
/// <summary>
/// Добавление данных в Region
/// </summary>
/// <param name="Region">JSON, содержит информацию для обновления</param>
[HttpPost]
public ActionResult RegionInsert(Region Region)
{
try
{
if (ModelState.IsValid)
{
string results = RegionIUDS.InsertRegion(Region);
if (results.Contains("ORA"))
{
return PartialView("~/Views/Shared/error.cshtml", results);
}
else
{
return PartialView("~/Views/Shared/done.cshtml", results);
}
}
else
{
return PartialView("~/Views/Shared/error.cshtml", "RegionInsert invalid Model");
}
}
catch (Exception e)
{
return View("~/Views/Shared/error.cshtml", e.Message);
}
}
/// <summary>
/// Удаление данных в Region
/// </summary>
/// <param name="Region">JSON, содержит информацию для удаления</param>
[HttpPost]
public ActionResult RegionDelete(string RegionRegionId)
{
try
{
if (ModelState.IsValid)
{
string results = RegionIUDS.DeleteRegion(Convert.ToInt32(RegionRegionId));
if (results.Contains("ORA"))
{
return PartialView("~/Views/Shared/error.cshtml", results);
}
else
{
return PartialView("~/Views/Shared/done.cshtml", results);
}
}
else
{
return PartialView("~/Views/Shared/error.cshtml", "RegionDelete invalid Model");
}
}
catch (Exception e)
{
return View("~/Views/Shared/error.cshtml", e.Message);
}
}
}
}
Фактически контроллеры принимают JSON и вызывают методы класса ORM.
И наконец View:
Тут все происходит в RegionTable.js:
var tableRegionDescription = {
TableID: 'Region'
, ContentDiv: '#allRegions'
, Columns: [{ ColumnName: "Region Name", ColumnID: "RegionRegionName", IsSort: 1, ColumnType: 'text', IsVisible: 'true', IsPK: 'false' }
,{ ColumnName: "Id", ColumnID: "RegionRegionId", IsSort: 0, ColumnType: 'text', IsVisible: 'false', IsPK: 'true' }]
, DeleteController: '/Region/RegionDelete'
, InsertController: '/Region/RegionInsert'
, UpdateController: '/Region/RegionUpdate'
, SelectController: '/Region/RegionSelect'
, tableData: []
};
$(document).ready(function () {
//создаем заголовок для таблицы и саму таблицу без данных
$(tableRegionDescription.ContentDiv).cre ateTableHead(tableRegionDescription);
//заполняем таблицу данными
$().createTable(tableRegionDescription);
});
И вот что мы получаем:
По поводу параметров:
TableID: - идентификатор таблицы, которая будет добавлена
, ContentDiv: - ID DIV, куда добавлять таблицу
, Columns: массив колонок таблицы
ColumnName - имя отображаемой колонки
ColumnID - идентификатор колонки
IsSort - включить сортировку
ColumnType - тип колонки
IsVisible - отображать в таблице или нет
IsPK - колонка, которая является первичным ключом, необходимо будет при удаление данных из таблицы
, SelectController: - контроллер, которые будет получать данные
, tableData: [] - массив, содержащий данные, которые будут загружены из SelectController
Создание хранимых процедур
Справочник регионов.
Пакет:
create or replace package admin_REGION_V01 as
function f_sel_REGION return tab_select_REGION pipelined;
function f_upd_REGION(p_REGION_ID in NUMBER,
p_REGION_NAME in VARCHAR2) return varchar2;
function f_ins_REGION( p_REGION_NAME in VARCHAR2) return varchar2;
function f_del_REGION(p_REGION_ID in NUMBER) return varchar2;
end admin_REGION_V01;
Тело пакета:
create or replace package body admin_REGION_V01 as
function f_sel_REGION return tab_select_REGION pipelined
as
l_t_select_REGION t_select_REGION;
begin
l_t_select_REGION:= t_select_REGION(0,'');
for C in (select
REGION_ID,REGION_NAME
from REGION
)
loop
l_t_select_REGION.REGION_ID:= C.REGION_ID;
l_t_select_REGION.REGION_NAME:= C.REGION_NAME;
pipe row (l_t_select_REGION);
end loop;
return;
end f_sel_REGION;
function f_upd_REGION( p_REGION_ID in NUMBER,
p_REGION_NAME in VARCHAR2) return varchar2
as
pragma autonomous_transaction;
my_errm VARCHAR2(32000);
begin
update REGION
set REGION_NAME = p_REGION_NAME
where REGION_ID= p_REGION_ID;
commit;
return 'REGION:' || p_REGION_NAME ||' was success updated';
exception when others then
my_errm := SQLERRM;
rollback;
return my_errm;
end f_upd_REGION;
function f_ins_REGION( p_REGION_NAME in VARCHAR2) return varchar2
as
pragma autonomous_transaction;
my_errm VARCHAR2(32000);
begin
insert into REGION
(
REGION_ID,
REGION_NAME
)
values (
seq_groups_id.nextval,
p_REGION_NAME);
commit;
return 'REGION:' || p_REGION_NAME|| 'was success inserted';
exception when others then
my_errm := SQLERRM;
rollback;
return my_errm;
end f_ins_REGION;
function f_del_REGION(p_REGION_ID in NUMBER) return varchar2
as
pragma autonomous_transaction;
my_errm VARCHAR2(32000);
begin
delete from REGION
where REGION_ID =p_REGION_ID;
commit;
return 'REGION: '|| p_REGION_ID||' was success deleted';
exception when others then
my_errm := SQLERRM;
rollback;
return my_errm;
end f_del_REGION;
end admin_REGION_V01;
Тут собственно я обернул все необходимые DML для работы приложения с таблицей.
Дальше в ASP MVC делаем класс, фактически это все колонки Вашей таблицы:
namespace TEST.Models.OracleORM.classes
{
public class Region
{
public int RegionRegionId { set; get; }
public string RegionRegionName { set; get; }
public Region() { }
}
}
Далее ORM класс, который будет вызывать хранимые процедуры:
using System;
using System.Collections.Generic;
using COMMON.Oracle;
using Erequest3AdminTool.Models.OracleORM.classes;
namespace Erequest3AdminTool.Models.OracleORM
{
public class RegionIUDS
{
private static String RegionSelect = @" select region_id F01
,region_name F02
from table(admin_region_v01.f_sel_region())";
private static String RegionUpdate = @"select admin_region_v01.f_upd_region( p_REGION_ID => &p_REGION_ID
,p_REGION_NAME => '&p_REGION_NAME') results from dual";
private static String RegionInsert = @"select admin_region_v01.f_ins_region( p_REGION_NAME => '&p_REGION_NAME') results from dual";
private static String RegionDelete = @"select admin_region_v01.f_del_region(p_REGION_ID =>&p_REGION_ID ) results from dual";
public static List<Region> SelectRegion()
{
List<Region> result = new List<Region>();
try
{
foreach (OracleField row in OracleLib.setExecuteSelect(RegionSelect))
{
result.Add(new Region()
{
RegionRegionId = Convert.ToInt32(row.F01),
RegionRegionName = row.F02
});
}
}
catch
{
throw;
}
return result;
}
public static string UpdateRegion(Region Region)
{
string result = "";
try
{
String l_sql = RegionUpdate;
l_sql = l_sql.Replace("&p_REGION_ID", Convert.ToString(Region.RegionRegionId));
l_sql = l_sql.Replace("&p_REGION_NAME", Region.RegionRegionName);
result = OracleLib.setExecuteIUD(l_sql);
}
catch
{
throw;
}
return result;
}
public static string InsertRegion(Region Region)
{
string result = "";
try
{
String l_sql = RegionInsert;
l_sql = l_sql.Replace("&p_REGION_NAME", Region.RegionRegionName);
result = OracleLib.setExecuteIUD(l_sql);
}
catch
{
throw;
}
return result;
}
public static string DeleteRegion(int RegionRegionId)
{
string result = "";
try
{
String l_sql = RegionDelete;
l_sql = l_sql.Replace("&p_REGION_ID", Convert.ToString(RegionRegionId));
result = OracleLib.setExecuteIUD(l_sql);
}
catch
{
throw;
}
return result;
}
}
}
Смысл я думаю понятен, просто перезаписываем переменные какими-то значениями, которые передаются из контроллера.
Далее контроллер:
namespace Erequest3AdminTool.Controllers
{
public class RegionController : Controller
{
/// <summary>
/// Полная страница для отображения
/// </summary>
public ActionResult RegionShowPage()
{
return View("RegionTable");
}
/// <summary>
/// Передает список всех пользователей через JSON
/// </summary>
public ActionResult RegionSelect()
{
return Json(RegionIUDS.SelectRegion(), JsonRequestBehavior.AllowGet);
}
/// <summary>
/// Обновить данные о Region
/// </summary>
/// <param name="Region">JSON, содержит информацию для обновления</param>
[HttpPost]
public ActionResult RegionUpdate(Region Region)
{
try
{
if (ModelState.IsValid)
{
string results = RegionIUDS.UpdateRegion(Region);
if (results.Contains("ORA"))
{
return PartialView("~/Views/Shared/error.cshtml", results);
}
else
{
return PartialView("~/Views/Shared/done.cshtml", results);
}
}
else
{
return PartialView("~/Views/Shared/error.cshtml", "RegionUpdate invalid Model");
}
}
catch (Exception e)
{
return View("~/Views/Shared/error.cshtml", e.Message);
}
}
/// <summary>
/// Добавление данных в Region
/// </summary>
/// <param name="Region">JSON, содержит информацию для обновления</param>
[HttpPost]
public ActionResult RegionInsert(Region Region)
{
try
{
if (ModelState.IsValid)
{
string results = RegionIUDS.InsertRegion(Region);
if (results.Contains("ORA"))
{
return PartialView("~/Views/Shared/error.cshtml", results);
}
else
{
return PartialView("~/Views/Shared/done.cshtml", results);
}
}
else
{
return PartialView("~/Views/Shared/error.cshtml", "RegionInsert invalid Model");
}
}
catch (Exception e)
{
return View("~/Views/Shared/error.cshtml", e.Message);
}
}
/// <summary>
/// Удаление данных в Region
/// </summary>
/// <param name="Region">JSON, содержит информацию для удаления</param>
[HttpPost]
public ActionResult RegionDelete(string RegionRegionId)
{
try
{
if (ModelState.IsValid)
{
string results = RegionIUDS.DeleteRegion(Convert.ToInt32(RegionRegionId));
if (results.Contains("ORA"))
{
return PartialView("~/Views/Shared/error.cshtml", results);
}
else
{
return PartialView("~/Views/Shared/done.cshtml", results);
}
}
else
{
return PartialView("~/Views/Shared/error.cshtml", "RegionDelete invalid Model");
}
}
catch (Exception e)
{
return View("~/Views/Shared/error.cshtml", e.Message);
}
}
}
}
Фактически контроллеры принимают JSON и вызывают методы класса ORM.
И наконец View:
<!--load js-->
<script src="@Url.Content("~/Content/JavaScript/JsORM/Region/js/RegionTable.js")"></script>
<div class="span4">
<h4>Regions</h4>
<div style="overflow-x: auto; width: 100%" id="allRegions"></div>
</div>
var tableRegionDescription = {
TableID: 'Region'
, ContentDiv: '#allRegions'
, Columns: [{ ColumnName: "Region Name", ColumnID: "RegionRegionName", IsSort: 1, ColumnType: 'text', IsVisible: 'true', IsPK: 'false' }
,{ ColumnName: "Id", ColumnID: "RegionRegionId", IsSort: 0, ColumnType: 'text', IsVisible: 'false', IsPK: 'true' }]
, DeleteController: '/Region/RegionDelete'
, InsertController: '/Region/RegionInsert'
, UpdateController: '/Region/RegionUpdate'
, SelectController: '/Region/RegionSelect'
, tableData: []
};
$(document).ready(function () {
//создаем заголовок для таблицы и саму таблицу без данных
$(tableRegionDescription.ContentDiv).cre
//заполняем таблицу данными
$().createTable(tableRegionDescription);
});
И вот что мы получаем:
По поводу параметров:
TableID: - идентификатор таблицы, которая будет добавлена
, ContentDiv: - ID DIV, куда добавлять таблицу
, Columns: массив колонок таблицы
ColumnName - имя отображаемой колонки
ColumnID - идентификатор колонки
IsSort - включить сортировку
ColumnType - тип колонки
IsVisible - отображать в таблице или нет
IsPK - колонка, которая является первичным ключом, необходимо будет при удаление данных из таблицы
, SelectController: - контроллер, которые будет получать данные
, tableData: [] - массив, содержащий данные, которые будут загружены из SelectController
Комментариев нет:
Отправить комментарий