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这两个控件的值来作为参数。

 

二、在VBA中生成和调用参数查询

参数查询代码如下:

PARAMETERS strA Text;

INSERT INTO 表1 ( hh )

values ([stra])

VBA 或者 VB 调用参数查询如下:

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 & "'"

以上代码中,如果字符串变量 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)

 

五、参考链接:

(1)http://access911.net/fixhtm/79FAB21E12DC.htm?tt=

(2)http://access911.net/fixhtm/72FAB21E15DC.htm?tt=

(3)http://access911.net/fixhtm/71FAB51E12DC.htm?tt=

(4)http://www.haishui.net/view.php?tid=18&id=278