欢迎您使用 EasyASP v3,通过此教程,您将了解到 EasyASP 的基本使用方法和一些使用技巧,包括 EasyASP 的部署与配置、控制台的使用、错误调试以及数据库的连接与参数化增删改查、后台表单验证、Json的创建与解析等 EasyASP 的特色功能。
请从 EasyASP 下载 页面下载 EasyASP v3 的最新版本到本地,并解压。然后将 source
文件夹下的 easyasp
文件夹拷贝到您的IIS站点根目录。如果您需要运行 EasyASP 自带的示例文件,请将 poordemo
文件夹也拷贝到您的IIS站点根目录。
如果您通过 http://(您的站点地址)/poordemo/easp.db/
访问可以运行 EasyASP 自带的数据库操作示例,则表示您已经正确的安装了 EasyASP v3。
EasyASP 内部的文件结构如下,其中的文件功能简单介绍一下:
easyasp |
|
├ console | 控制台示例 |
│ ├ console.asp | 控制台后端 |
│ └ index.html | 控制台前台 |
├ core | 核心类文件 |
│ ├ easp.cache.asp | 缓存类 |
│ ├ easp.console.asp | 控制台类 |
│ ├ easp.date.asp | 日期类 |
│ ├ easp.db.asp | 数据库操作类 |
│ ├ easp.encrypt.asp | 简单对称加解密类 |
│ ├ easp.error.asp | 异常类 |
│ ├ easp.fso.asp | 文件系统操作类 |
│ ├ easp.http.asp | 远程文件操作类 |
│ ├ easp.json.asp | JSON类 |
│ ├ easp.list.asp | 超级数组类 |
│ ├ easp.str.asp | 字符串操作类 |
│ ├ easp.stringbuilder.asp | 字符串构建类 |
│ ├ easp.stringobject.asp | 字符串对象类 |
│ ├ easp.tpl.asp | 模板类 |
│ ├ easp.upload.asp | 无组件上传类 |
│ ├ easp.validation.asp | 表单验证类 |
│ ├ easp.var.asp | 超级变量类 |
│ └ easp.xml.asp | XML文档操作类 |
├ lang | 内部语言包 |
│ └ zh.asp | 中文语言包 |
├ plugin | 官方自带插件 |
│ ├ easp.base64.asp | Base64 加解密插件 |
│ ├ easp.hanzi.asp | 汉字转拼音、翻译、分词插件 |
│ ├ easp.md5.asp | MD5 加密插件 |
│ ├ easp.pluginsample.asp | 插件示例 |
│ └ easp.trace.asp | 变量调试插件 |
├ easp.asp | EasyASP 主文件 |
└ easp.config.asp | EasyASP 配置文件 |
要在您的代码中使用 EasyASP ,请直接在 asp 页面中把 easp.asp
包含进去即可,如:
<!--#include file="easyasp/easp.asp" --> <% '此处编写您的代码 %>当然,您也可以使用:
<!--#include virtual="/easyasp/easp.asp"-->需要注意的是,您的页面中不应该再包含
@LANGUAGE
语句。easyasp
文件夹放在您的IIS站点根目录而是某个子目录中,则需要在 easp.config.asp
中设置 Easp.BasePath 的值为正确的路径,否则 EasyASP 的插件系统将不能正常使用。
让我们先来编写第一个 EasyASP 程序吧。
在您的IIS站点根目录下建立一个 demo.asp
文件,然后其中写入以下的代码:
<!--#include file="easyasp/easp.asp" --> <% Easp.Print "Hello World!" %>此时,通过
http://(站点地址)/demo.asp
访问,可以看到如下的结果:
Hello World!就像您看到的一样,EasyASP 已经初始化了一个实例
Easp
,所有 EasyASP 的主要方法都可以直接使用 Easp.
前缀来直接调用。EasyASP v3 在页面加载完毕后,会自动销毁Easp
实例,所以无需手动销毁该实例。
EasyASP v3 全部重写了数据库操作类,采用了参数化查询的方式读写数据库,从根本上杜绝了注入漏洞,同时放弃了大量的在方法中使用多个参数混用的方式,回归本质,鼓励大家使用完整的 SQL 编写查询语句,并注重效率,不管是分页还是批量增删改数据,都有不错的性能表现。接下来就介绍一下 EasyASP v3 数据库操作里这些令人激动的新功能吧。
EasyASP 的数据库连接非常简单,相信用过旧版本的朋友应该比较清楚了,v3 的数据库连接除了保持这种简洁的方式之外,更增强了多数据库连接的功能。EasyASP 内置了 Access
/ MSSQL
/ MYSQL
三种数据库的连接支持,同时,您也可以很方便的扩展至连接到任何其它符合工业标准的数据库(如 Oracle
/ db2
/ postgresql
等)。
EasyASP 连接到数据库非常简单,可以直接在 easp.config.asp
中配置,下面是连接到三种内置数据库的示例:
'示例一:连接到 Access Easp.Db.SetConn "ACCESS", "/datas/database.mdb", "password" '示例二:连接到 MSSQL Easp.Db.SetConn "MSSQL", "database", "sa:password@(local)" '示例三:连接到 MYSQL Easp.Db.SetConn "MYSQL", "database", "root:password@127.0.0.1"注:如果要连接到MySQL数据库,服务器需要安装MySQL ODBC驱动(版本5.1),下载地址 http://dev.mysql.com/downloads/connector/odbc/5.1.html
参数的详细说明请查看 API 中的 Easp.Db.SetConn 。 接下来您就可以直接使用操作数据库的方法了,比如:
Set rs = Easp.Db.Query("Select * From table_name where id = 1")
我们知道在一般的数据库操作中,采用参数化查询不仅可以避免数据库被注入,而且可以提升 SQL 语句执行的效率。EasyASP 的数据库操作采用了全参数化查询,并且采用了一个非常简洁的方案。为了你能有一个清晰的对比,先看看我们平时是怎么写带变量的SQL查询语句的,基本上看上去是下面这样:
f1 = "value1" f2 = Now() conn.execute "Insert Into table_name (field1, field2) Values ('" & f1 & "', '" & f2 & "')"这里只有两个变量,如果变量有很多个,只是阅读起来就会有非常大的障碍,而且,如果数据处理不当,它还有被注入的风险。如果是取记录集,则还要先建立
ADODB.RecordSet
对象,代码会更加复杂。
再来看 EasyASP 是如何处理带变量参数的查询的,下面的例子一个是插入记录,一个是取记录集:
'插入一条新记录 Easp.Db.Exec("Insert Into table_name (field1, field2) Values ({f1}, {f2})") '获取记录集 Set rs = Easp.Db.Exec("Select * From table_name Where field1 = {f1} And field2 = {f2}")相信你看出来了,其中的f1和f2应该是可以用变量的条件,那么,它们的值是如何代入SQL中呢?我知道你非常想这样:
f1 = "value1" f2 = Now() Easp.Db.Exec("Insert Into table_name (field1, field2) Values ({f1}, {f2})")但是由于 ASP 语法的限制,暂时还无法实现上面的做法,在 EasyASP 中,采用了还是非常简单的做法,所有SQL语句中的变量用
Easp.Var("变量名")
来赋值即可:
Easp.Var("f1") = "value1" Easp.Var("f2") = Now() Easp.Db.Exec("Insert Into table_name (field1, field2) Values ({f1}, {f2})")这样就可以了,不再用看起来傻缺到无以复加的字符串变量和引号、& 连接符去“中断” SQL 语句,也不用考虑参数的顺序,最重要的是,你完全可以不用去管参数是什么类型的数据(想想你平时比如忘记了在文本型字段值的两端加单引号而带来的种种噩梦吧)。
Easp.Var("变量名")
这种用法在 EasyASP 里叫做“超级变量”,详细的说明请查看“超级变量”一节。这里你只需要知道,所有的 Get/Post/ServerVariables 值已经内置在超级变量中了,所以如果要使用这些值是不用再自己写超级变量的,直接在 SQL 中使用就行了!具体怎么使用这些值,请看下一节的说明。
但是,这里还留下几个问题,第一,如果我想要指定参数的类型和大小怎么办?在 EasyASP 里,非常好办:
Easp.Db.Exec("Insert Into table_name (field1, field2) Values ({f1:nvarchar(100)}, {f2:datetime})")看到了吧,直接在参数名后跟一个冒号,然后写入参数的类型和大小即可(大小可省略)。
第二,如果 SQL 语句中有不是参数的部分要代入变量,怎么办?什么是不是参数的部分呢,就是 SQL 语句中不是作为查询参数的部分,比如表名(表前缀)、字段名、Where条件表达式等。通常的方法是这样的:
Dim frontstr frontstr = "field" Easp.Db.Exec("Insert Into table_name (" & frontstr & "1, " & frontstr & "2) Values ({f1:nvarchar(100)}, {f2:datetime})")很破坏阅读性有木有?所以,EasyASP 给出的解决方法是这样的,当然还是要用到超级变量:
Easp.Var("frontstr") = "field" Easp.Db.Exec("Insert Into table_name ({=frontstr}1, {=frontstr}2) Values ({f1:nvarchar(100)}, {f2:datetime})")只需要像使用不带类型和大小的参数一样使用,在参数名前面加一个等号即可,它会把超级变量的值替换到 SQL 语句中去。 注意:使用 {=超级变量} 存在注入风险,所以这个变量的值应该由您在程序中指定而不是从 Get/Post/Cookies 提交而来。
再写一个结合超级变量的用于模糊搜索的 SQL 语句示例,假设提交的搜索关键字参数名为 key
(*.asp?key=新闻):
Easp.Var("likeKey") = "%{=key}%" Set rs = Easp.Db.Query("Select * From news Where Title Like {likeKey}")
第三,如果我的 SQL 语句中有 in(…)
这样的写法,又该怎么在 EasyASP 中写代码呢?还是那句话,So easy!
Easp.Var("myArr") = Split("1 3 4 6 7") '首先,要有一个变量超级数组(也可以是QueryString/Form数组) Call Easp.Db.Exec("delete from t where id in ({(myArr:int)})") '执行的语句会是 delete from t where id in (1, 3, 4, 6, 7)只需要把数组超级变量用
{(变量名)}
一对括号括起来放在标签中就行啦,有数据类型的时候,和普通标签一样加在变量名后就行了,如果是字符串,也是一样的操作方式,下面的例子有点小变化,参数只做为in条件里的一部分:
Easp.Var("myArr") = Split("one,two,three", ",") Call Easp.Db.Exec("delete from t where id in ('zero', {(myArr)}, 'four')") '执行的语句会是 delete from t where id in ('zero', 'one', 'two', 'three', 'four')
最后,再次提示一下,超级变量的功能很强大,可以让你轻松的做到不用写一行代码去读取表单提交的值就把数据插入到数据库中啦,请从下一节“超级变量”中查看。
EasyASP v3 推荐所有的读增改删都通过输入完整的 SQL 语句来操作,你可以用下面这两个方法,它们略有不同:
Easp.Db.Query(sql) Easp.Db.Exec(sql)在 sql 是
Select
语句即是取记录集的时候,这两个方法是完全一样的。但在 sql 是 Insert
/ Update
/ Delete
语句的时候,Easp.Db.Query 返回的是一个布尔值,表示成功与否,比如使用 Delete
语句删除记录时,如果 sql 执行有错误或者 sql 语法正确但是没有删除任何记录,都会返回 False
值。而 Easp.Db.Exec 返回的是受影响的行数。
EasyASP 同样提供了一组方法用于数据的 CRUD 操作:
'读取记录集 Set rs = Easp.Db.Sel(sql) '新增记录 result = Easp.Db.Ins(table, field:value[,field:value...]) '更新记录 result = Easp.Db.Upd(table, field=value[,field=value...], where) '删除记录 result = Easp.Db.Del(table, where)下面给出一些示例代码,首先是读取记录集的方法:
'读取记录集 Set rs = Easp.Db.Sel("Select * From table_name where class_id = {cid} Order By ID Desc")这个方法和 Easp.Db.Query 和 Easp.Db.Exec 的不同之处在于,此方法始终返回记录集对象,即使 sql 语句不是
Select
语句。用一个 MSSQL 的例子来说明这个方法的一些特殊应用吧,假设一个 MSSQL 的数据库表采用了自增字段作为主键,那么可以用此方法在插入数据的同时得到新插入的记录的ID号或是包含新记录的记录集:
'返回MSSQL自增ID及新增记录示例: Dim rs Easp.Var("name") = "coldstone" Set rs = Easp.Db.Sel("Insert Into Tb (TName, TDate) Values ({name}, {easp.date});Select @@Identity As ID;Select * From Tb Where ID = @@Identity;") Set rs = Easp.Db.NextRS(rs) Easp.PrintlnString rs '{"total":1, "rows":[{"ID":31}]} Set rs = Easp.Db.NextRS(rs) Easp.PrintlnString rs '{"total":1, "rows":[{"ID":31, "TName":"coldstone", "TDate":"2014-06-23"}]} Easp.Db.Close(rs)当用此方法返回多个记录集的时候,可以用 Easp.Db.NextRS 返回下一个记录集对象。
其次是新增记录的方法:
Dim result result = Easp.Db.Ins("table_name", "field1:{f1}, field2:{f2}")其中第一个参数是要添加记录的
数据表名
,第二个参数是逗号隔开的 字段:值
序列。如果您要更改默认的字段分隔符号(默认为半角逗号),可以设置下面的属性:
Dim result Easp.Db.InsertSeparator = "||" result = Easp.Db.Ins("table_name", "field1:{f1}||field2:{f2}")此方法返回的是受影响的行数,即添加成功会返回 1。
接下来是更新记录的方法:
Dim result result = Easp.Db.Upd("table_name", "field1 = {f1}, field2 = field2 + 1", "class_id = {cid}"此方法返回的也是受影响的行数。需要注意的是,这个方法没有使用和添加记录一样的冒号隔开字段名和值,而是使用等号,和您在 SQL 中使用
Update
语句时的写法一致。
最后是删除记录的方法:
Dim result result = Easp.Db.Del("table_name", "class_id = {cid}"此方法同样返回受影响的行数。
EasyASP 自带了分页记录集功能,不仅可以对复杂的 SQL 查询生成分页记录集,而且会自动判断不同的数据库类型和版本并用不同的方法优化生成分页的效率。在分页导航的调用上,沿用了 2.2 版本的简洁配置和调用方式,并进行了优化升级,还内置了 bootstrap
分页样式。
EasyASP 默认读取 URL 参数名为 page
的值为分页的页码值(*.asp?page=N),如果您要修改,可以设置下面这个属性:
Easp.Db.PageParam = "p"像上面修改此属性后,则会将 URL 参数名为
p
的值作为页码值(*.asp?p=N)。
如果您需要测试不同的页码值的分页结果,或者是在生成列表静态页这样的特殊应用中,还可以用重写 URL 参数值的方式自由指定当前分页要读取的页码值,重写 URL 参数相信你已经从上面的教程中了解到方法了,就是使用超级变量:
Easp.Var("page") = 12上面这句代码会在调用分页记录集后显示第12页的分页结果。
EaspASP 默认每页的分页数量是25条记录/页,要修改这个值,可以在属性中配置:
Easp.Db.PageSize = 50
使用 EasyASP 获取分页记录集的方式和使用普通的 SQL 查询方式基本是一样的,除了方法名不同:
Set rs = Easp.Db.GetRS(sql)其中的 sql 语句可以是任意包含复杂的 Join 联查以及子查询的语句,但是如果数据库是
Access
或者 MSSQL
,则需要满足以下几个条件:
1. 结果集的第一个字段必须是主键;
2. sql 语句结尾的Order By
部分中不能出现括号,且参于排序的字段不能带表前缀;
3. 如果是Access
或者MSSQL 2000
及以下版本,则所有参与排序的字段必须被包含在结果集中(如果采用MSSQL 2005+
,但是语句是比较复杂的多表联查,可能也需要,视情况而定);
4. 如果是ACcess
且 sql 是Select Distinct
语句开头,则需要改写 sql 语句再加一个父查询,如:Select * From (Select Distinct … From table)
。
取得记录集的同时,以下几个属性也会同时更新为和分页记录集相关的值,当然,每次获取分页记录集时,它们都会更新为最近一次的值:
Easp.Db.PageRecordCount '读取分页记录集总记录数 Easp.Db.PageCount '读取分页记录集总页数 Easp.Db.PageIndex '读取分页记录集当前页码 Easp.Db.PageCurrentSize '读取分页记录集当前页记录数 Easp.Db.PageMinRow '读取分页记录集当前页最小记录行号 Easp.Db.PageMaxRow '读取分页记录集当前页最大记录行号
接下来就是显示分页导航链接的部分了,你可以使用下面这一行代码来显示 EasyASP 默认的分页导航链接:
Easp.Print Easp.Db.GetPager("default")效果差不多是下面这个样子的(需要 CSS 样式代码):
Easp.Db.SetPager("default", "{first}{prev}{liststart}{list}{listend}{next}{last} {jump}", Array("jump:select", "jumplong:0"))其中,
{first}
和 {last}
表示首页尾页链接,{prev}
和 {next}
表示上一页和下一页链接,{list}
表示分页列表链接,{liststart}
和 {listend}
表示分页列表两侧起始页码和结束页码链接,{jump}
表示跳转表单。而后面的数组参数,则表示一些附加配置,这里是表示跳转表单使用下拉列表,下拉列表显示所有的分页。
这个例子用到的 CSS 样式代码是这样的:
/*总容器样式*/ .pager { padding: 3px; text-align: center; color:#66C;font-size:12px; font-family:Tahoma;} /*分页链接样式*/ .pager a { margin: 2px; padding:2px 5px; color: #66C; text-decoration: none; border: 1px solid #aad; } /*分页链接鼠标移过的样式*/ .pager a:hover { color: #000; border: 1px solid #009; background-color:#DCDCF3; } /*当前页码的样式*/ .pager span.current { font-weight: bold; margin: 0 2px; padding: 2px 5px; color: #fff; background-color: #66C; border: 1px solid #009; } /*不可用分页链接的样式(比如第1页时的“上一页”链接)*/ .pager span.disabled { margin: 0 2px; padding: 2px 5px; color: #CCC; border: 1px solid #DDD; } /*跳转下拉菜单的样式*/ .pager select {margin: 0px 2px -2px 2px; color:#66C;font-size:12px; font-family:Tahoma;} /*跳转文本框的样式*/ .pager input {margin: 0px 2px -2px 2px; color:#66C; border: 1px solid #DDD; padding:2px; text-align:center;font-size:12px; font-family:Tahoma;}除了上面这个小例子之外,你还可以使用内置的
bootstrap
分页样式,这将生成 BootStrap v3
中的分页 HTML 代码。
Easp.Db.GetPager("bootstrap") '标准分页样式 Easp.Db.GetPager("bootstrap.pager") 'Previous/Next样式 Easp.Db.GetPager("bootstrap.pagerside") 'Older/Newer样式就是这样,EasyASP 可以通过配置生成你需要的各种样式的导航,容器可以配置为
<div>
或者 <ul>
,样式的名称也都可以自定义以适应你的任意前端需求,完整的使用示例和各配置项的详细说明,请查看 Easp.Db.SetPager。
由于目前 AJAX 技术的广泛应用,JSON 格式的数据也被时常用来做为数据岛。使用 EasyASP 可以方便的生成 JSON 格式的记录集分页数据,下面是一个综合实例,代码描述了如何通过分页记录集得到一个 JSON 格式数据并在此基础上对 JSON 数据进行一些扩展:
'连接到Access数据库 Easp.Db.SetConnection "default", 1, "/source/sampledata/Northwind.mdb", "" Dim sql,rs,rsjson,json '定义SQL sql = "Select * From 产品" '定义每页记录数 Easp.Db.PageSize = 5 '取得分页记录集 Set rs = Easp.Db.GetRS(sql) '不用\uxxxx形式编码生成JSON中的中文字符 Easp.Json.EncodeUnicode = False '生成JSON格式数据 rsjson = Easp.Encode(rs) Easp.Db.Close(rs) '解析JSON,准备为JSON添加数据 Set json = Easp.Decode(rsjson) '为JSON数据添加"总记录数"、"总页数"、"当前页码"和"每页记录数" json.Put "total", Easp.Db.PageRecordCount json.Put "pagecount", Easp.Db.PageCount json.Put "pageindex", Easp.Db.PageIndex json.Put "pagesize", Easp.Db.PageCurrentSize '输出更新后的JSON Easp.Echo json.toString() Set json = nothing上面是服务器端的代码,可以得到下面格式的 JSON 数据,并会根据传入的
page
参数值的不同值显示不同的分页数据:
{ "total": 77, "rows": [{ "产品ID": 1, "产品名称": "苹果汁", "供应商ID": 10, "类别ID": 1, "单位数量": "每箱24瓶", "单价": 11, "库存量": 39, "订购量": 0, "再订购量": 10, "中止": true } //.....此处省略中间的部分产品信息 , { "产品ID": 5, "产品名称": "麻油", "供应商ID": 2, "类别ID": 2, "单位数量": "每箱12瓶", "单价": 21.35, "库存量": 0, "订购量": 0, "再订购量": 0, "中止": true }], "pagecount": 16, "pageindex": 1, "pagesize": 5 }而在网页前端,如果想得到第
5
页的第 3
条记录的产品名称,以使用 jQuery 为例,可以这样实现:
$.get('product-list.asp', //分页页面地址 {page:5}, //要获取的页码 function(data){ //回调 alert(data.rows[2].产品名称); //第3行记录的产品名称 }, 'json' //指定ajax返回后的是json格式数据 );
首先要说说这里的批量操作并不是指用一条SQL语句删除相同条件的多条记录,而是指批量操作多条本应该单独执行的SQL语句,比如批量插入、按ID号批量更新、删除等。 这里举个简单的插入数据的例子循序渐进的来看看 EasyASP 的批量操作是如何工作的:
我们假设用户要向数据库的 ProductClass
表插入一条记录,所以在HTML页面上构建了如下的表单代码:
<form action="insert.asp?action=save" method="post"> <input type="text" name="productclassname" /> <input type="submit" value="Submit"> </form>那么用 EasyASP 写的插入一条数据的完整代码如下:
<!--#include file="easyasp/easp.asp" --> <% If Easp.Get("action") = "save" Then Dim result result = Easp.Db.Ins("ProductClass", "class_id:{easp.newid}, class_name:{productclassname}") '上面的 {easp.newid} 会生成一个唯一不重复的可排序10位字符串,推荐用于数据表的主键ID字段 If result > 0 Then Easp.JsAlert("插入成功!") End If %>现在我们要让用户可以批量插入数据,于是我们将 HTML 页面的代码修改为一次可以输入4个 productclassname:
<form action="insert.asp?action=save" method="post"> <input type="text" name="productclassname" /> <br /> <input type="text" name="productclassname" /> <br /> <input type="text" name="productclassname" /> <br /> <input type="text" name="productclassname" /> <br /> <input type="submit" value="Submit"> </form>请注意,上面的文本框的 name 值都是一样的,所以在服务器端,会接收到一个序列而不是单个文本框的值。而后台代码则只需要做出非常少的修改就行了:
<!--#include file="easyasp/easp.asp" --> <% If Easp.Get("action") = "save" Then Dim result result = Easp.Db.InsBatch("ProductClass", "class_id:{easp.newid}, class_name:{productclassname}") '批量操作函数里的 {easp.newid} 会为每条记录生成一个新ID If result > 0 Then Easp.JsAlert(result & "条记录插入成功!") End If %>相信你可以看得出来,EasyASP 中的数据库批量操作基本上和操作一般的查询是一样的,只是方法名有所不同而已。 下面列出了 EasyASP 所有可用的数据库批量操作方法:
'用于默认数据库连接的方法 '批量执行SQL(注:Select 语句不能用于批量操作) result = Easp.Db.ExecBatch(sql) '批量新增记录 result = Easp.Db.InsBatch(table, field:value[,field:value...]) '批量更新记录 result = Easp.Db.UpdBatch(table, field=value[,field=value...], where) '批量删除记录 result = Easp.Db.DelBatch(table, where)上面的方法返回的都受影响的行数。
除了可以接收表单提交的序列值之外,也可以手动代入数组值用于批量操作时的参数,比如:
Dim result Easp.Var("id") = Array(12,23,45,34,67,89,90) '下面的两种方法都是正确的,第二种方法效率更高: '方法一,直接写SQL语句 result = Easp.Db.ExecBatch("delete from product where id = {id}") '方法二,用批量删除方法,会自动优化SQL语句,效率更高 result = Easp.Db.DelBatch("product", "id = {id}")上面的代码会删除
product
表中所有 id
在数组中的值。EasyASP 中的批量新增、删除、更新方法都会自动优化SQL语句,效率会有非常高的提升,在批量操作时建议使用这些方法。
EasyASP 调用存储过程的方式也是比较简单的,下面四种方式都是可以的:
Set proc = Easp.Db.Query("call 存储过程名 {参数1} [,{参数2}] [,{@输出参数}] [,{@@输入输出参数}]") Set proc = Easp.Db.Query("exec 存储过程名 {参数1} [,{参数2}] [,{@输出参数}] [,{@@输入输出参数}]") Set proc = Easp.Db.Exec("call 存储过程名 {参数1} [,{参数2}] [,{@输出参数}] [,{@@输入输出参数}]") Set proc = Easp.Db.Exec("exec 存储过程名 {参数1} [,{参数2}] [,{@输出参数}] [,{@@输入输出参数}]")如你所见,参数中的“输入参数”用
{参数}
的形式,“输出参数”用 {@参数}
的形式,“既是输入参数又是输出参数”的用 {@@参数}
表示。参数的赋值,当然还是用的是超级变量。这几个方法会在执行存储过程后返回一个字典对象,这个字典对象固定包含以下4个键值:
rows
- 受影响的行数
return
- 返回值
out
- 输出参数(字典对象),可用("out")("@参数名")调用
rs
- 记录集对象(如果不返回记录集则该项值为Null)
下面用一个完整的例子看一下使用方法:
Dim proc, rs Easp.Var("uid") = Easp.NewID() Easp.Var("uname") = "coldstone" Easp.Var("dname") = "冷石" Easp.Var("upass") = Easp("md5")("123456") Set proc = Easp.Db.Query("exec sp_new_user {uid}, {uname}, {dname}, {upass}, {@usercount}") '假设存储过程 sp_new_user 成功会返回值1,失败返回0,并且选取本条新增的记录和一个输出参数 @usercount Easp.Println "返回值::" & proc("return") Easp.Println "总人数::" & proc("out")("@usercount") '如果返回记录集不为空 If Not IsNull(proc("rs")) Then Set rs = proc("rs") Easp.Println "新增用户ID为:" & rs("uid") Easp.Db.Close(rs) End If Set proc = Nothing如果要返回的是多个记录集,也可以用下面的方法获取下一个记录集对象:
Set rs1 = Easp.Db.NextRS(rs)
先帖一段百科中的解释:
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
简单的说,就是很多句SQL在执行同一个业务逻辑时,可能其中某句会出错导致只执行了其中的一部分,这样会引发数据的不一致问题。事务处理的功能就是先预执行这些语句,在所有语句都没有错误的情况下再统一执行,如果出错,则取消之前的全部SQL操作。EasyASP 简单的封装了 ADO 的事务处理,视数据库的支持程度,事务也可以嵌套处理。下面是简单的事务处理代码:
Dim result Easp.Db.Begin '开始事务 result = Easp.Db.Query("insert into table1 values ({f1}, {f2})") If Not result Then Easp.Db.RollBack '回滚事务 Else result = Easp.Db.Query("update table2 set fa1 = {fa1} where fa2 = {fa2}") If Not result Then Easp.Db.RollBack '回滚事务 Else Easp.Db.Commit '提交事务 End If End If这样,这两个SQL语句要么同时执行,要么都不执行,不会出现一个执行而另一个没执行的情况了。
如果您的系统使用了多个数据库,可以用下面的方法添加其它数据库连接:
Easp.Db.SetConnection "connName", "MSSQL", "database2", "sa:password@192.168.0.2"其中的
connName
是自定义的连接对象名称,在操作此数据库的数据前,要用下面的方法获取到该连接的 Connection 对象后再使用:
'取得连接对象 Set conn = Easp.Db.GetConnection("connName") '读取记录集 Set rs = Easp.Db.Execute(conn, "Select * From table_name where id = 1") '添加记录 Call Easp.Db.Insert(conn, "table_name", "id:{easp.newid}, field1:{field1}, field2:GetDate()") '修改记录 Call Easp.Db.Update(conn, "table_name", "field1 = {field1}, field2 = {field2}", "id = {id}") '删除记录 Call Easp.Db.Delete(conn, "table_name", "id = {id}") '批量执行SQL(注:Select 语句不能用于批量操作) Call Easp.Db.ExecuteBatch(conn, sql) '批量新增记录 Call Easp.Db.InsertBatch(conn, table, field:value[,field:value...]) '批量更新记录 Call Easp.Db.UpdateBatch(conn, table, field=value[,field=value...], where) '批量删除记录 Call Easp.Db.DeleteBatch(conn, table, where)
如果您要连接到不是 EasyASP 内置的三种类型(Access
/MSSQL
/MYSQL
)的数据库,比如 Oracle,则可以用下面的方法先创建一个数据库连接对象再接管到 EasyASP 内部:
'创建自定义连接对象 Set conn = Easp.Db.CreateConnection("Provider=msdaora;Data Source=192.168.0.3;User Id=user;Password=password;") '方法一:接管到 EasyASP 内部,接管后可以和上面一样直接使用 Easp.Db.Exec 等方法 Easp.Db.DefaultConn = conn Set rs = Easp.Db.Exec("Select * From table_name") '方法二:不接管到 EasyASP,直接进行数据操作 Set rs = Easp.Db.Execute(conn, "Select * From table_name")
超级变量是 EasyASP v3 中的一个全局字典对象,使用超级变量可以方便的处理 GET 及 POST 数据、数组、服务器变量、变量嵌套引用,特别的是,超级变量还可以直接以参数的形式用于数据库查询的 SQL 语句中,可以极大的简化您的开发流程。下面就来看一下超级变量的基本用法吧。
超级变量是一个可读写的字典对象,所以您可以像使用普通字典对象一样设置和读取它的键值:
'设置变量 Easp.Var("myname") = "coldstone" Easp.Var("mylogintime") = Now() '读取变量 Easp.Println Easp.Var("myname") 'coldstone Easp.Println Easp.Var("mylogintime") '2014/06/01 02:06:07您可以在超级变量的值中方便的引用其它超级变量的值,这个功能您可以做无限级的嵌套:
Easp.Var("mylastname") = "Tien" Easp.Var("myname") = "Ray {=mylastname}" Easp.Var("welcome") = "Welcome {=myname}!" Easp.Print Easp.Var("welcome") 'Welcome Ray Tien!如果你如果直接给超级变量赋值为数组,则可以同时把数组组合的字符串、数组的长度、原始数组及每个元素的值都写入超级变量:
Easp.Var("myvar") = Array(1,2,3,4,5) Easp.Println Easp.Var("myvar") '1, 2, 3, 4, 5 Easp.Println IsArray(Easp.Var("myvar_array")) 'True Easp.Println Easp.Str.ToString(Easp.Var("myvar_array")) '[1,2,3,4,5] Easp.Println Easp.Var("myvar_array_length") '5 Easp.Println Easp.Var("myvar_array_2") '3超级变量还可以直接用于 Easp.Str.Format 方法的第一个参数中:
Easp.Var("myname") = "Coldstone" Easp.Print Easp.Str.Format("Welcome {=myname}, you have {0} {1} to do.", Array(11,"job(s)")) 'Welcome Coldstone, you have 11 job(s) to do.以上是超级变量的基本用法,但超级变量的作用远不止于此。
嗯,首先,超级变量已经内置了一组数据,分别是 Request.QueryString
值、Request.Form
值、EasyASP 系统变量、Request.ServerVariables
值,您可以直接使用超级变量来取得这些值,超级变量会依次查找这些集合并返回正确的值:
Easp.Var("get.id") '等同于 Easp.Get("id") 或者 Request.QueryString("id") Easp.Var("post.selid") '等同于 Easp.Post("selid") 或者 Request.Form("selid") Easp.Var("easp.newid") '固定用法,返回一个10位唯一不重复字符串 Easp.Var("server.remote_addr") '等同于 Request.ServerVariables("REMOTE_ADDR")注:内置变量并不会预先读取和储存,而是在您第一次使用超级变量时才加载,当然,也不会在第二次使用时重复加载,所以不用担心它影响您的程序性能。
上面的语句中 get.
和 post.
可以省略,即使用下面的用法效果是一样的:
Easp.Var("id") Easp.Var("selid")但是要注意的是,如果
QueryString
参数和提交的 Form
参数存在同名,则默认返回 get.参数
的值,您仍然可以用 post.参数
来获取 From
参数的值。QueryString
参数或者 Form
参数是一个序列,则也会同时写入序列/数组化序列/序列长度/每个元素的值:
'比如提交页面为 http://(站点地址)/index.asp?type=news&type=product&id=20 '并通过 Form 提交了一组复选框表单数据 selid 的值分别是 1, 3, 6 ,7 Easp.Var("type") 'news, product Easp.Var("type_array") 'Array("news", "product") Easp.Var("type_array_length") '2 Easp.Var("type_array_1") 'product Easp.Var("id") '20 Easp.Var("selid") '1, 3 ,6, 7 Easp.Var("selid_array") 'Array(1,3,6,7) Easp.Var("selid_array_length") '4 Easp.Var("selid_array_0") '1 Easp.Var("selid_array_2") '6当然,超级变量还有一个最重要的功能,就是可以直接以参数的形式用于数据库查询的 SQL 语句中,关于这一点,相信你已经从上面数据库操作教程中的“参数化查询”一节中有所了解了,所有超级变量中的内置变量,都可以直接用到SQL语句中。下面就再用一个简单的示例复习一下吧:
'设置变量 Easp.Var("tablename") = "Photo" Easp.Var("parentclassid") = "203DB0LIW4" Easp.Var("classname") = "海边风景" '添加一条记录,其中 {=变量} 表示把变量值直接替换到 SQL 语句中,{变量} 表示以参数化查询的参数方式加入到 SQL 语句中 Easp.Db.Exec("Insert Into ES_{=tablename} (class_id, parent_id, class_name) Values ({easp.newid}, {parentclassid}, {classname})")
为了方便您在 ASP 开发过程中调试各种变量、监视SQL语句执行情况,EasyASP 设计了控制台 (Console) 模式。使用控制台可以很方便的进行断点调试而不会影响现有程序的执行效果。现在就来看看控制台是怎么使用的吧。
EasyASP 的控制台 (Console) 是一个基于浏览器的独立应用,所以建议您在开发过程中使用可分屏浏览器,例如傲游浏览器(按F10打开分屏功能),Firefox和Chrome亦有分屏插件。也可以使用IE浏览器打开两个窗口分列屏幕的左右。
提示:如果您的程序页面使用了框架集(Frame或者iframe),那么,把控制台作为一个单独的框架页嵌入页面中,效果更好。
EasyASP 的控制台功能默认是关闭的,请先在 easp.config.asp
中找到如下代码,修改并启用控制台功能:
'是否开启控制台 Easp.Console.Enable = True在编写您的代码后,在浏览器其中一个窗口打开您开发的程序页面,另一个窗口打开地址
http://(站点地址)/easyasp/console/index.html
,如下图所示:
正如上图中显示的效果一样,当你的程序页面运行时,在控制台窗口中会实时显示您的页面中的数据库 SQL 语句执行的情况,同时,您也可以用下面的代码添加到程序中调试需要显示的变量或任意的对象,变量的值也会实时的显示到控制台中,而对您的程序页面不会有任何影响:
Easp.Console variables 'variables可以是任意的ASP变量或对象,比如字符串、数组、记录集、字典对象等
由于默认情况下控制台页面是任何人都可以访问的,所以,为了防止未授权的人访问控制台查看运行时的 SQL 语句从而造成数据库结构的泄漏,您可以给控制台加密。要加密控制台的访问,请先在 easp.config.asp
中设置一个 token 密码:
'在这里设置token的值,区分大小写,如果设置了Token值, '仅前端输入的token和这里设置一致时,才会输出控制台信息 Easp.Console.Token = "Abcd1234"然后,您在访问控制台时,点击
Token
链接,输入您设置的 Token 密码,控制台的信息才会输出,否则,会出现错误提示,如图:
另外,您还可以点击 Start
/ Pause
开启和暂停控制台的输出,点击 Clear
清除屏幕上的控制台信息。
EasyASP 的后台验证采用 jQuery 式的链式操作,可以非常灵活的组合多种规则。后台验证的基本用法有下面几种:
Easp.VarVal("post.username") '验证超级变量 Easp.GetVal("username") '验证Url参数(QueryString) Easp.PostVal("username") '验证表单(Form) Easp.Str.Validate(string) '验证字符串前三个的参数和
Easp.Var
/ Easp.Get
/ Easp.Post
的参数一致,最后一个的参数是要验证的字符串原始值。验证时可以用的语法是下面这样的(功能太多,看起来有点复杂,不过几乎都是可选参数,后面会分解说明):
[Call | 变量名 = ] Easp.VarVal(参数)[.Name(名称)][.Field(表单项名)][.Split(分隔符)][.Default(默认值)].验证规则.Msg(验证失败信息)[.验证规则.Msg(验证失败信息)...][.Join(分隔符)|.GetArray][.Alert|.AlertUrl|.NoReturn|.PrintEnd|.PrintEndJson]是不是有点晕,不要慌,我们还是先用一个例子来说明一下如何使用,后面再仔细讲解怎么组合不同的规则。
比如我们要验证一个用表单提交来的用户名,规则是3-20位,只能使用英文、数字、下划线和短横线,并且不能为空,如果为空就弹出信息“用户名不能为空!”,如果不符合规则就弹出信息“用户名不符合规则!”,并返回至提交前的页面,那么我们可以这么写:
Call Easp.PostVal("username").Required_ '第一个规则:不能为空 .Msg("用户名不能为空!")_ '第一个规则验证失败时的信息 .Test("^[\w-]{3,20}$")_ '第二个规则 .Msg("用户名不符合规则")_ '第二个规则验证失败时的信息 .Alert '当有验证失败时,弹出信息并返回上一页新手注意:上面代码中的
_
是 ASP(VBS) 语法中把一行ASP代码写为多行的连接符,和 :
把多行代码写到一行的作用正好相反。
上面是一个最基本的验证不能为空再加一个正则验证的例子,但即便如此,EasyASP 还是可以将它再次简化为:
Call Easp.PostVal("username").Name("用户名").Required.Test("username").Alert这是因为 EasyASP 里已经内置了大量的验证规则和验证失败时的错误提示信息,你可以在下面的 内置验证规则 中查看。
如果要在验证通过后返回值,可以直接用变量取得返回值:
Dim uName uName = Easp.PostVal("username").Name("用户名").Required.Test("username").Alert
(未完待续)