spGet Framework 1.0






3.32/5 (12投票s)
告别 ORM、EF,这是一个直接访问存储过程的 JavaScript 框架。
引言
spGet 是一个 JavaScript 框架,它提供了一种从前端 Web 应用程序直接访问存储过程的方式。您可以直接从客户端脚本通过 spGet 使用存储在远程数据库中的存储过程。目前,spGet 只提供了 C# / ASP.NET / MS-SQL 组合版本,我将添加其他各种组合,如 Java、JSP、Spring、MySQL 和 Oracle。spGet 框架功能强大、有用,但简单易学。没有学习曲线,您可以在一分钟内适应新框架。使用 spGet,您不再需要担心后端控制器和模型。您只需在数据库中创建存储过程,然后从 JavaScript 代码中调用它。此外,spGet 让您摆脱了 ORM 或后端控制器的束缚。您无需使用 Entity Framework 或 Hibernate 等 ORM 框架,也无需创建模型、控制器和服务来访问数据库。
必备组件
- jQuery 库 1.0 或更高版本。
- Newtonsoft.Json.Net 8.0 最新版本
Nuget: PM> Install-Package Newtonsoft.Json
环境
- 浏览器兼容性
- Microsoft IE(8,9,10,11 ~ ), Microsoft Edge, Chrome, Fire Fox, Safari, Opera, 现代移动浏览器
- ASP.NET 版本
- Visual Studio 版本
- 2012, 2013, 2015
安装
下载
- 从下面的链接获取 spGet 最新版本。
https://github.com/jxhv/spGet/releases/download/spGet/Jeremisoft-spGet-CORE.zip
定义您的数据库连接
- Web.config
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Demo.mdf;Initial Catalog=aspnet-WebApplication2-20160213110200;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
复制文件
对于 ASP.NET MVC 版本
- 将 ASP.NET-MVC\Controllers\SpGetController.cs 文件复制到您的项目 Controllers 文件夹
- 将 ASP.NET-MVC\Models\spGet 文件夹复制到您的项目 Models 文件夹
- 将 ASP.NET-MVC\Scripts\spGet 文件夹复制到您的项目 Scripts 文件夹
对于 WebForm 版本
- 将 ASP.NET-WebForm\Services\spGet.asmx(spGet.asmx.cs) 文件复制到您的项目 Services 文件夹。如果 Services 文件夹不存在,请先创建它。
- 将 ASP.NET-WebForm\Models\spGet 文件夹复制到您的项目 Models 文件夹
- 将 ASP.NET-WebForm\Scripts\spGet 文件夹复制到您的项目 Scripts 文件夹
为 spGet 编写 MapRoute(仅限 ASP.NET MVC 版本)
- 在您的 RouteConfig.cs 中为 spGet 添加 MapRoute。
routes.MapRoute(
name: "SpGet",
url: "SpGet/{action}",
defaults: new { controller = "SpGet", action = "" }
);
编写前端代码
<!DOCTYPE html>
<html>
<head>
<title>SpGet - StordProcedure to Script Framework</title>
<style>
li { display: inline-block; width: 120px; border-bottom: 1px solid #808080; }
</style>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.0.min.js"></script>
<script src="~/Scripts/ParaScript/spGet.js"></script>
<script>
$(function () {
// list a table
var result = "";
var data = new SpGet().AsJson("mem_get_tbl");
for (var i = 0, ln = data.length; i < ln; i++) {
result += "<ul><li>" + data[i].name + "</li></ul>");
}
$("#board").html(result);
});
</script>
</head>
<body>
@* Define an AntyForgeryForm for script security *@
<form id="__ajaxAntiForgeryForm" action="#"
method="post">@Html.AntiForgeryToken()</form>
<h1>SpGet - Member List</h1>
<div id="board"></div>
</body>
</html>
库
getAsJson() 方法
getAsJson()
方法通过存储过程以 JSON 对象数组的形式从数据库获取表。目标存储过程必须通过 `SELECT` 语句返回一个或多个表。
语法
var data = new spGet().getAsJson(SP_NAME, [param], [log]);
参数
- 必需的 `SP_NAME` 参数指定您要使用的存储过程名称。
- 可选的 `[param]` 参数指定一组存储过程参数的键值对。
- 可选的 `[log]` 参数指定一个日志字符串以发送到存储过程。此参数仅用于写入日志。您需要在目标存储过程中使用一个名为 `@logging` 的参数来使用此参数。
Returns
- JSON 对象数组(一维数组):如果存储过程返回单个表
- JSON 对象数组的数组(二维数组):如果目标存储过程通过多个 SELECT 语句返回多个表,则结果将作为二维数组传递。第一维表示表的列表,第二维表示记录的列表。
- 返回字段的类型转换
- spGet 会自动进行存储过程结果字段到 JavaScript 对象的类型转换。您无需创建模型或 ORM 来接收表结果。
行为
- spGet 检测每个 `[param]` 属性值的_数据类型_,并生成具有相应 SQL Server 数据类型的存储过程参数。您无需担心参数的数据类型转换。
SQL: CREATE PROCEDURE test_sp @name nvarchar(36), @age int, @height float
JavaScript: new spGet().getAsJson("test_sp", { name:"John Doe", age:30, height:5.76 });
对应类型
spGet (JavaScript) | SQL Server |
字符串 | char, nchar, varchar, nvarchar, text, ntext, datetime |
整数 | int, smallint, tinyint, bigint, (decimal, numeric) |
Float | float, real, money |
Bool | 位 |
getAsInt() 方法
getAsInt()
方法从存储过程获取一个整数返回值。目标存储过程必须通过 `RETURN` 语句返回一个整数值。此方法非常适合调用执行批处理更新并返回执行结果代码的存储过程。
语法
var result = new spGet().getAsInt(SP_NAME, [param], [log]);
Returns
- 整数值
参数和行为与 getAsJson() 相同
getAsStr() 方法
getAsStr()
方法从存储过程获取一个字符串值。目标存储过程必须通过一个名为 `@OUTPUT` 的 OUTPUT 参数返回字符串值。
语法
var result = new spGet().getAsStr(SP_NAME, [param], [log]);
Returns
- 字符串值
参数和行为与 getAsJson() 相同
示例
示例 1:返回单个表的存储过程
存储过程
CREATE PROCEDURE employee_get_tbl @name nvarchar(36), @mobile nvarchar(36)
AS
BEGIN
SELECT name_n, LEFT(mobile, 5) AS mobile, user_id
FROM Member
WHERE name_n LIKE '%' + @name + '%' AND mobile LIKE '%' + @mobile + '%'
END
HTML 代码
<table>
<tbody id=tbMembers">
</tbody>
</table>
JavaScript 代码
var result = "";
var spget = new spGet();
var data = spget.getAsJson("employee_get_tbl", { name: "ba", mobile: "714" });
for(var i = 0; i < data.length; i++) {
result += "\
<tr>\
<td>" + data[i].name_n + "</td>\
<td>" + data[i].mobile + "</td>\
<td>" + data[i].user_id + "</td>\
</tr>";
}
$("#tbMembers").html(result);
示例 2:返回多个表的存储过程
存储过程
CREATE PROCEDURE employee_get_tbl_member_n_company @member nvarchar(36), @com_id int
AS
BEGIN
SELECT name_n, LEFT(mobile, 5) AS mobile, user_id
FROM Member
WHERE name_n LIKE '%' + @name + '%'
SELECT name, address, phone
FROM Company
WHERE id = @com_id
END
HTML 代码
<table>
<tbody id=tbMembers">
</tbody>
</table>
<table>
<tbody id=tbCompanies">
</tbody>
</table>
JavaScript 代码
var result1 = "";
var result2 = "";
var members = [];
var companies = [];
var rec = {};
var param = { member: "Sam", com_id: 1234 };
var data = new spGet().getAsJson("employee_get_tbl_member_n_company", param);
if(data == null)
return;
members = data[0];
companies = data[1];
for(var i = 0; i < members.length; i++) {
rec = members[i];
result1 += "\
<tr>\
<td>" + rec.name_n + "</td>\
<td>" + rec.mobile + "</td>\
<td>" + rec.user_id + "</td>\
</tr>";
}
$("#tbMembers").html(result1);
for(var i = 0; i < companies.length; i++) {
rec = companies[i];
result2 += "\
<tr>\
<td>" + rec.name + "</td>\
<td>" + rec.address + "</td>\
<td>" + rec.phone + "</td>\
</tr>";
}
$("#tbCompanies").html(result2);
示例 3:如何使用日志参数(与 getAsInt 一起使用)
存储过程
CREATE PROCEDURE employee_set_member_phone
@member_id int,
@phone nvarchar(36),
@logging nvarchar(max) -- you must add this parameter at the end of parameter list
AS
BEGIN
DECLARE @result int
UPDATE Member
SET phone = @phone
WHERE id = @member_id
SET @result = @@ROWCOUNT
EXEC write_error_log @log -- custom log writing SP that has been made by you
RETURNS @result
END
JavaScript 代码
var param = {
member_id: 17623,
phone: "802-132-1111"
};
var log = '{ date:"02/09/2012", editor: 19772, ip:"122.12.177.123" }';
var result = new spGet().getAsInt("employee_set_member_phone", param, log);
if(result < 1)
alert("error");
else
alert("success");
示例 4:使用 getAsStr 接收字符串
存储过程
CREATE PROCEDURE employee_get_val_name_only
@member_id int,
@OUTPUT nvarchar(36) OUTPUT
AS
BEGIN
SELECT @OUTPUT = name_n
FROM Member
WHERE id = @member_id
END
JavaScript 代码
var result = new spGet().getAsStr("employee_get_val_name_only", { member_id: 18928 });
if(result == null)
alert("error");
else
alert(result);
加密存储过程名称
如果您不希望您的存储过程名称被公开,有一个方法可以帮助您。
存储过程
CREATE PROCEDURE employee_get_val_name_only
@member_id int,
@OUTPUT nvarchar(36) OUTPUT
AS
BEGIN
SELECT @OUTPUT = name_n
FROM Member
WHERE id = @member_id
END
your_view_file.cshtml
ASP.NET MVC 版本
<script> var sp_mem_get_name = "@Html.Raw(SpGet.Security.Encrypt("employee_get_val_name_only "))"; <script>
ASP.NET MVC 版本
<script> var sp_mem_get_name = "<%=SpGet.Security.Encrypt("mem_add")%>"; <script>
-
your_script_file.js
var result = new spGet().getAsStr(sp_mem_get_name, { member_id: 18928 });
if(result == null)
alert("error");
else
alert(result);
为了您的安全,您必须将 /Models/spGet/Security.cs 中的 DES_KEY 更改为您自己的密钥。
许可和结论
许可证
spGet 框架根据 MIT License 分发(https://open-source.org.cn/licenses/MIT)
库
- jQuery (https://jqueryjs.cn)
许可证信息: jQuery 库根据 MIT License 条款使用。jQuery 许可证信息。
- Newtonsoft Json.NET (http://www.newtonsoft.com/json)
许可证信息: Json.NET 根据 MIT License 条款使用。
结论
作者
- Daniel Yu (jxhv@live.com)
分布式
您可以从下方尝试 spGet 的最新版本。