Access 的 MDB / MDE 中存在类似存储过程得概念(建立时也可以使用 DDL 语句的 create procedure 语句建立),但是叫参数查询,并且一个参数查询只支持一条 JET sql 语句,因而 JET sql 不存在程序流控制语句,所有的程序流控制都交由 VBA 控制。也就是说 T-sql 中的 IF 以及 CASE 语句在 JET sql 中不存在,但是部分功能可以用 IIF 函数以及 SWITCH 函数代替,具体内容请参考 ACCESS 帮助。JET sql中也可以定义“变量”,但是这个变量和 T-sql 中的变量是不同的概念,因此在 JET sql 中被称为“参数”。
事实上,Access(2000 及以上版本)中所谓“存储过程”,和 sql Server 中的 Stored Procedure 是不能比的。它只能算是“Stored Procedure Lite”,不支持多条 sql 语句,不支持逻辑语句(呵呵,毕竟不是 T-sql)等等,我也还不清楚它是不是预编译了。不过,正如同 VBScript 实现的所谓“类”仅仅具有封装性,对于代码结构的“美化”和程序重用性具有很大促进一样,Access 的“轻量存储过程”,对于规范,小出错几率的数据库操作应该也有帮助,并且性能可能会有提高。
一、在ACCESS中构建参数查询
关键字 ParaMETERS 可构建参数
ParaMETERS aa Short, bb Short; SELECT 表1.ID FROM 表1 WHERE (((表1.ID)>[aa] And (表1.ID)<=[bb])); |
上述参数查询在打开时会提示用户输入 [aa] [bb] 这两个参数。ACCESS 中还有一种参数查询是直接用窗体的某个控件来传递参数给查询,代码如下
SELECT 表1.ID FROM 表1 WHERE (((表1.ID)>FORMS!窗体A!控件A And (表1.ID)<=FORMS!窗体A!控件B)); |
当“窗体A”打开时,双击这个查询时无需输入参数,查询会自动调用窗体上控件A控件B这两个控件的值来作为参数。
ParaMETERS strA Text; INSERT INTO 表1 ( hh ) values ([stra]) |
Public Function AppendX() Dim cmdByRoyalty As ADODB.Command Dim prmByRoyalty As ADODB.Parameter Dim rstByRoyalty As ADODB.Recordset Dim intRoyalty As String Set cmdByRoyalty = New ADODB.Command cmdByRoyalty.CommandText = "查询1" cmdByRoyalty.CommandType = adCmdstoredProc intRoyalty = Trim(InputBox("输入参数:")) Set prmByRoyalty = cmdByRoyalty.CreateParameter("strA", adChar, adParamInput, 255) cmdByRoyalty.Parameters.Append prmByRoyalty prmByRoyalty.Value = intRoyalty Set cmdByRoyalty.ActiveConnection = CurrentProject.Connection Set rstByRoyalty = cmdByRoyalty.Execute End Function |
三、何时使用参数查询
我们使用 Access 存储过程的主要目的,就是使用参数额外提供的查询,使用存储过程,我们不必再面对将参数值拼接到 sql 语句字符串中时遇到的各种麻烦,比如:
Dim sql sql = "SELECT * FROM Users WHERE UserName = '" & userName & "'" |
Dim sql sql = "SELECT * FROM Users WHERE UserName = '" & Replace(userName, "'", "''") & "'" |
Dim sql sql = "SELECT * FROM Users WHERE UserName = @userName" |
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) |
五、参考链接:
(1)http://access911.net/fixhtm/79FAB21E12DC.htm?tt=
(2)http://access911.net/fixhtm/72FAB21E15DC.htm?tt=
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。