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
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!