当前页面位置: » 丰搜网 » 文档中心 » 详细内容
在access中使用“存储过程”(一)
我们已经熟悉在 asp 中通过调用 sql server 存储过程来执行数据库操作,不过大家是否知道,在桌面级数据库 access 中,我们也能够创建并使用“存储过程”?
access + asp 是开发轻量级 web 应用程序的绝佳组合:简单,快速,兼容性好,但是性能通常不高。并且,用 adodb.connection 和 recordset 对象来执行 sql 语句的方式,也有一些不方便,因为带参数的 sql 语句的参数值也常常是拼接到字符串中,于是便有了诸如“单引号问题”这样的麻烦。使用存储过程的一个好处就是,支持 sql 语句参数值的另外提供。
事实上,access(2000 及以上版本)中所谓“存储过程”,和 sql server 中的 stored procedure 是不能比的。它只能算是“stored procedure lite”,不支持多条 sql 语句,不支持逻辑语句(呵呵,毕竟不是 t-sql)等等,我也还不清楚它是不是预编译了。不过,正如同 vbscript 实现的所谓“类”仅仅具有封装性,对于代码结构的“美化”和程序重用性具有很大促进一样,access 的“轻量存储过程”,对于规范,小出错几率的数据库操作应该也有帮助,并且性能可能会有提高。
下面我译 step by step 的方式,介绍如何在 access 中创建存储过程,然后在 asp 程序中使用它。
(一)在 access 中创建“存储过程”
不知道大家的 access 应用水平如何,反正它对于我来说,仅仅就是一个 mdb 数据库文件的创建工具,我只会新建 mdb 文件,然后在 access 的界面中创建表,索引,约束等等,over~
access 中的“查询”,就扮演了存储过程的角色。下文中我提到的 access 的“存储过程”或者“查询”都是指这个东西
对于“查询”的创建,access 提供了一个傻瓜工具,类似 vs.net 里边建立 dataadapter 时的向导。不过我喜欢直接写 sql 代码
好,下面先看看我们这个简单的例子中所使用的数据库的表结构。
然后在
access 主界面上点击左侧的“查询”按钮,再在右边双击“在设计
视图中创建查询”,以打开查询设计
视图。
这时弹出的是可视化的查询生成器,我们首先添加 sql 语句需要涉及的表。
添加表之后,在设计
视图上点击鼠标右键,选择“sql
视图”,以切换到 sql 代码编辑窗口。
好,下面说说
access 的
存储过程的特点。
access 的查询,我目前的感觉是对 sql 语句的一个包装,或许进行了某种优化如预编译。我们不能像写 sql server
存储过程那样使用多重操作,事务,逻辑判断,循环等等……
但是我们使用
access 存储过程的主要目的,就是使用参数额外提供的查询,使用
存储过程,我们不必再面对将参数值拼接到 sql 语句字符串中时遇到的各种麻烦,比如:
代码:
--------------------------------------------------------------------------------
dim sql
sql = "select * from users where username = '" & username & "'"
--------------------------------------------------------------------------------
以上代码中,如果字符串变量 username 中含有“'”单引号,则会报错。我们必须手工转化:
代码:
--------------------------------------------------------------------------------
dim sql
sql = "select * from users where username = '" & replace(username, "'", "''")
& "'" '转化为连续两个单引号
--------------------------------------------------------------------------------
而使用带参数查询,我们的 sql 语句可以写为:
代码:
--------------------------------------------------------------------------------
dim sql
sql = "select * from users where username = @username"
--------------------------------------------------------------------------------
然后把参数 @username 的值以 command 对象的 parameter 属性来传入即可,很方便直观。
代码:
--------------------------------------------------------------------------------
with cmd
'创建参数对象
.parameters.append .createparameter("@username")
'给各参数指定值
.parameters("@username") = username
end with
--------------------------------------------------------------------------------
这里还要说明
access 存储过程中参数的使用。和 sql server 的
存储过程中用 @ 变量指定参数,然后同名传入参数对象不同,
access 中的参数,是以“顺序”而非“名字”来识别的。传入的参数无需指定名字,随便起,sql 中的参数名字也可以随便起,只要传入参数值时,按照 sql 语句中的参数出现顺序指定就行了。通常,我们使用 command 对象的 execute 方法,直接传入参数值数组来执行~
代码:
--------------------------------------------------------------------------------
cmd.execute , array(username)
--------------------------------------------------------------------------------
再比如,你的一个
access 存储过程这么写:
代码:
--------------------------------------------------------------------------------
select * from users where username = p_username and booktitle = p_booktitle
--------------------------------------------------------------------------------
你可以就这么执行,通过传入参数值数组,但是顺序要对应:
代码:
--------------------------------------------------------------------------------
cmd.execute , array(username, booktitle)
--------------------------------------------------------------------------------
ok,看看我们的例子中使用的两个查询,一个是写入数据。写好 sql 语句后存并命名。
另一个读取数据的
存储过程代码。