VB中调用带参数存储过程的实现

2/27/2006来源:Visual Basic教程人气:10103

VB做为快速应用开发(RAD)工具越来越得到开发人员的认可和接受。它对许多API(如ODBCAPI、SOCKETAPI等等)的封装使得编程变得简单起来。同时,它支持集成开发环境下的可视化、事件驱动、面向对象等编程特点。下面,我们谈谈在VB中调用存储过程的实现方法及其注意事项。

----我们知道,VB的数据库编程有许多种方法,比如直接用ODBCAPI编程,这种方法灵活、高效,程序员可以实现对数据库复杂的控制;也可以用VB中的数据对象,如RDO(远程数据对象)、DAO(数据访问对象)、ADO(ActiveX数据对象),这种方法实现起来方便、快捷,但灵活性较差一些。由于存储过程在实现数据封装、隐藏以及代码的预编译、减少网络负载、维护方便等优点,所以被许多RDBMS和编程工具做支持。VB中的各类数据对象也提供对存储过程的支持。

----我们以ADO为例来说明其实现的步骤

----1.创建、调试存储过程。你可以在数据库中也可以在其他外挂程序的支持下进行存储过程的创建和调试工作。本例中的存储过程代码如下(使用PUBS的MSSQL中的例子库):

CREATEPROCEDUREmyprocedure
@job_idsmallint,
@job_lvltinyint
AS
SELECT*
FROMemployee
WHEREjob_id<@job_id
ANDjob_lvl>@job_lvl

----2.在VB中生成一个新的工程,工程有一窗体,一个COMMAND(NAME:COMMAND1)按钮,一个MSFlexGrid(NAME:MSFlexGrid1)控件。

----3.创建连接ADOconnection;

----4.创建命令ADOcommand;

----5.创建参数并设置各个参数的属性;

----6.执行ADOcommand;

----7.对数据进行处理;MSFlexGrid显示查询到的数据

----8.释放连接,退出程序。

----其中代码如下:

在窗体中声明以下变量:
Dimcnn1AsADODB.Connection‘连接
DimmycommandAsADODB.Command‘命令
Dimparm_jobidAsADODB.Parameter‘参数1
Dimparm_joblvlAsADODB.Parameter‘参数2
DimrstByQueryAsADODB.Recordset‘结果集
DimstrCnnAsString‘连接字符串

在窗体的LOAD事件中加入如下代码:
Setcnn1=NewADODB.Connection
‘生成一个连接
strCnn="DSN=MYDSN;uid=sa;pwd="
‘创建的系统数据源MYDSN指向PUBS数据库
cnn1.OpenstrCnn‘打开连接
在窗体的UNLOAD中的加入代码如下:
cnn1.Close‘关闭连接
Setcnn1=Nothing‘释放连接

在按钮中的代码如下:
DimIAsinteger
Dimjasinteger
Setparm_jobid=NewADODB.Parameter
Setmycommand=NewADODB.Command
'parm_jobid.Name="name1"
thislinecanbeommited
parm_jobid.Type=adInteger‘参数类型
parm_jobid.Size=3‘参数长度
parm_jobid.Direction=adParamInput
‘参数方向,输入或输出
parm_jobid.value=100‘参数的值
mycommand.Parameters.Append
parm_jobid‘加入参数


Setparm_joblvl=NewADODB.Parameter
‘parm_joblvl.Name="name2"
parm_joblvl.Type=adInteger
parm_joblvl.Size=3
parm_joblvl.Direction=adParamInput
mycommand.value=100
mycommand.Parameters.Appendparm_joblvl


mycommand.ActiveConnection=cnn1
‘指定该command的当前活动连接
mycommand.CommandText="myprocedure"
‘myprocedure是你要调用的存储过程名称
mycommand.CommandType=adCmdStoredProc
‘表明command为存储过程
SetrstByQuery=NewADODB.Recordset
SetrstByQuery=mycommand.Execute()
I=0
DoWhileNotrstByQuery.EOF
I=I 1‘I中保存记录个数
rstByQuery.MoveNext
Loop
MSFlexGrid1.Rows=I 1
‘动态设置MSFlexGrid的行和列
MSFlexGrid1.Cols=rstByQuery.Fields.Count 1
MSFlexGrid1.Row=0
ForI=0TorstByQuery.Fields.Count-1
MSFlexGrid1.Col=I 1
MSFlexGrid1.Text=rstByQuery.Fields.Item(I).Name
Next‘设置第一行的标题,用域名填充

I=0
SetrstByQuery=mycommand.Execute()
DoWhileNotrstByQuery.EOF
I=I 1
MSFlexGrid1.Row=I‘确定行
Forj=0TorstByQuery.Fields.Count-1
MSFlexGrid1.Col=j 1
MSFlexGrid1.Text=rstByQuery(j)
‘添充所有的列
Next
rstByQuery.MoveNext

Loop‘这个循环用来填充MSFlexGrid的内容

----特殊说明

----1.Setrecordset=command.Execute(RecordsAffected,Parameters,Options)command.ExecuteRecordsAffected,Parameters,Options这是command的两种用法,一种有返回结果集,一种没有返回结果集。

----RecordsAffected:是指用update、delete操作时所影响的结果,对select的查询,其值为-1;这和在Mssqlserver中的QueryAnalyzer中的不一样。QueryAnalyzer中,select、update、delete的结果显示的是实际查、改、删的记录数。

----Options:指明command的类型,有adCmdText、adCmdTable、adCmdStoredProc等等,用户可见MSDN。

----2.在参数的类型中,用户可以用varchar来代替integer,系统会帮你自动实施转化;

----3.本例中仅为带输入参数的存储过程,如果要有输出参数,根据MSDN的材料,用ADO不行。你可以用RDO数据对象,MSDN中有一个例子,此处不做过多赘述;

----4.可以不用ADOCOMMAND对象,也可直接调用ADOCONNECTION的execute方法,结果很类似。

->