在 Access 中使用“存储过程”

access|存储过程

由于片上传问题所以图片没有显示:
完整文章请看:http://www.luckybbs.com/showAnnounce.asp?id=36487
我们已经熟悉在 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 语句后保存并命名。

此主题相关图片

(二)使用存储过程

然后我们可以在 ASP 程序中调用这些存储过程了。

这里可以看到为什么我说 Access 中的查询就是它的存储过程——我们的 Command 对象的 CommandType 属性设置的是 4,即 Stored Proc!

so...

以下的代码很简单:

代码:
<%
Option Explicit

Dim s
Randomize
s = Rnd * 100

Dim conn, cmd
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command")

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("sp.mdb")

With cmd
.ActiveConnection = conn
.CommandType = &H0004 ''存储过程
.CommandText = "AddNewData"
End With

cmd.Execute , Array(CStr(Now()), CSng(s))

With cmd
.ActiveConnection = conn
.CommandType = &H0004 ''存储过程
.CommandText = "GetData"
End With

Dim resultRS, resultArray
Set resultRS = cmd.Execute(, Null)

If Not resultRS.EOF Then
resultArray = resultRS.GetRows()
End If

Set resultRS = Nothing
Set cmd = Nothing
conn.Close
Set conn = Nothing

Response.Write "<ul>"
Dim i
For i = 0 To UBound(resultArray, 2)
Response.Write "<li>" & resultArray(0, i)
Response.Write " " & resultArray(1, i)
Response.Write " " & resultArray(2, i)
Response.Write "</li>"
Next
Response.Write "</ul>"
%>

运行结果。
此主题相关图片

感觉起来,速度似乎很快,呵呵~

不知道这样在 Access 中使用存储过程的意义大不大,不过确实很好玩

A

时间: 2024-10-02 15:59:22

在 Access 中使用“存储过程”的相关文章

Access中的存储过程怎么写

问题描述 我在Access数据库中看见了procedure,但是在那里写啊. 解决方案 解决方案二:http://www.pconline.com.cn/pcedu/empolder/db/access/0310/226080.html网网找找一堆,珍惜你的可用分,现在分难赚啊解决方案三:access里的存储过程...还不如直接写语句.解决方案四:不知道Access存储过程的效率怎样?解决方案五:在Access中应该不叫存储过程吧,好像叫"查询",在Access中"查询&qu

ACCESS中调用后台存储过程

ACCESS是一个Client/Server的优秀前端开发工具,具有易学易用,界面友好,开发简单,和其他数据库接口灵活. 但是,它要对大量数据处理时,速度比较慢.当有大量数据需要处理时,不能在Client端处理,而必须在Server端处理. 但ACCESS和Server端之间多数通过ODBC来连接,这样就增加了调用后台存储过程的难度.笔者通过在实际工作中长期的摸索,根据不同的业务需要,可以用下面三种方法去调用后台存储过程. 一. Access 向后台提交作业,这一个个作业对应一个个的存储过程.在

在ACCESS 中调用后台存储过程

access|存储过程|后台 ACCESS是一个Client/Server的优秀前端开发工具,具有易学易用,界面友好,开发简单,和其他数据库接口灵活.但是,它要对大量数据处理时,速度比较慢.深圳供电局现有60万用户,下面有6个营业所,通过64K DDN 和局相连,如果有一个营业所要对1万用户进行处理的话,要花2~3小时,严重影响其他业务的开展.所以,当有大量数据需要处理时,不能在Client端处理,而必须在Server端处理. 但ACCESS和Server端之间多数通过ODBC来连接,这样就增加

如何在ACCESS中调用后台存储过程

ACCESS是一个Client/Server的优秀前端开发工具,具有易学易用,界面友好,开发简单,和其他数据库接口灵活.但是,它要对大量数据处理时,速度比较慢.当有大量数据需要处理时,不能在Client端处理,而必须在Server端处理. 但ACCESS和Server端之间多数通过ODBC来连接,这样就增加了调用后台存储过程的难度.笔者通过在实际工作中长期的摸索,根据不同的业务需要,可以用下面三种方法去调用后台存储过程. 一. Access 向后台提交作业,这一个个作业对应一个个的存储过程.在S

在ACCESS中调用后台存储过程

ACCESS是一个Client/Server的优秀前端开发工具,具有易学易用,界面友好,开发简单,和其他数据库接口灵活.但是,它要对大量数据处理时,速度比较慢.当有大量数据需要处理时,不能在Client端处理,而必须在Server端处理.但ACCESS和Server端之间多数通过ODBC来连接,这样就增加了调用后台存储过程的难度.笔者通过在实际工作中长期的摸索,根据不同的业务需要,可以用下面三种方法去调用后台存储过程. 一. Access 向后台提交作业,这一个个作业对应一个个的存储过程.在SQ

学会在ASP中使用存储过程

存储过程|存储过程 学习使用存储过程(Stored Procedure),是ASP程序员的必须课之一.所有的大型数据库都支持存储过程,比如Oracle.MS SQL等,(但MS Access不支持,不过,在Access里可以使用参数化的查询).使用存储过程有许多好处,它可以封装复杂的数据逻辑,充分发挥大型数据库本身的优势.我们知道,ASP并不适合做复杂的数据运算,而通过OLD DB访问数据库,由于数据需要在ASP和数据库之间传递,相当消耗系统资源.事实上,如果数据库仅仅起着数据存储的作用,那么它

ASP中使用存储过程

存储过程|存储过程 学习使用存储过程(Stored Procedure),是ASP程序员的必须课之一. 所有的大型数据库都支持存储过程,比如Oracle.MS SQL等,(但MS Access不支持,不过,在Access里可以使用参数化的查询). 存储过程是利用SQL Server所提供的Tranact-SQL语言所编写的程序.Tranact-SQL语言是SQL Server提供专为设计数据库应用程序的语言,它是应用程序和SQL Server数据库间的主要程序式设计界面.它好比Oracle数据库

ACCESS 调用后台存储过程的实现方法_Access

但是,它要对大量数据处理时,速度比较慢.当有大量数据需要处理时,不能在Client端处理,而必须在Server端处理. 但ACCESS和Server端之间多数通过ODBC来连接,这样就增加了调用后台存储过程的难度.笔者通过在实际工作中长期的摸索,根据不同的业务需要,可以用下面三种方法去调用后台存储过程. 一. Access 向后台提交作业,这一个个作业对应一个个的存储过程.在SQL Server 6.5中,通过Task Manager 来建立相应的Task; 而在Oracle 8.0中,通过Ma

ASP如何通过匹配access中的数据以获得其中的密码?

问题描述 ASP如何通过匹配access中的数据以获得其中的密码? 在做网站的时候又遇到一个问题,就是如何应用asp语言来达到获取寻回密码的功能,我现在表单里有邮箱和电话两个最能代表个人信息的数据,但是如何通过匹配这两个数据以获得密码却成了一道越不过去的坎.具体代码应该怎么写呢?有前辈可以指教一下吗?我尝试过的基本上都不行 解决方案 找回密码的含义不是找到输入的密码,相反,如果密码能找到,那么非常不安全.一旦数据库泄露,后果是灾难的.你应该让用户输入他注册的用户名和邮箱,你判断用户名和邮箱在你数