VB中访问存储过程的几种办法

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

使用SQL存储过程有什么好处

■SQL存储过程执行起来比SQL命令文本快得多。当一个SQL语句包含在存储过程中时,服务器不必每次执行它时都要分析和编译它。

■调用存储过程,可以认为是一个三层结构。这使你的程序易于维护。如果程序需要做某些改动,你只要改动存储过程即可

■你可以在存储过程中利用Transact-SQL的强大功能。一个SQL存储过程可以包含多个SQL语句。你可以使用变量和条件。这意味着你可以用存储过程建立非常复杂的查询,以非常复杂的方式更新数据库

■最后,这也许是最重要的,在存储过程中可以使用参数。你可以传送和返回参数。你还可以得到一个返回值(从SQLRETURN语句)。

环境:WinXP VB6 sp6 SqlServer2000

数据库:test

表:Users

CREATETABLE[dbo].[users](

[id][int]IDENTITY(1,1)NOTNULL,

[truename][char](10)COLLATEChinese_PRC_CI_ASNULL,

[regname][char](10)COLLATEChinese_PRC_CI_ASNULL,

[pwd][char](10)COLLATEChinese_PRC_CI_ASNULL,

[sex][char](10)COLLATEChinese_PRC_CI_ASNULL,

[email][text]COLLATEChinese_PRC_CI_ASNULL,

[jifen][decimal](18,2)NULL

)ON[PRIMARY]TEXTIMAGE_ON[PRIMARY]

GO

ALTERTABLE[dbo].[users]WITHNOCHECKADD

CONSTRAINT[PK_users]PRIMARYKEYCLUSTERED

(

[id]

)ON[PRIMARY]

GO

存储过程select_users

CREATEPROCEDUREselect_users@regnamechar(20),@numrowsintOUTPUT

AS

Select*fromusers

SELECT@numrows=@@ROWCOUNT

if@numrows=0

return0

elsereturn1

GO

存储过程insert_users

CREATEPROCEDUREinsert_users@truenamechar(20),@regnamechar(20),@pwdchar(20),@sexchar(20),@emailchar(20),@jifendecimal(19,2)

AS

insertintousers(truename,regname,pwd,sex,email,jifen)values(@truename,@regname,@pwd,@sex,@email,@jifen)

GO

在VB环境中,添加DataGrid控件,4个按钮,6个文本框

代码简单易懂。

‘引用microsoftactivedataobject2.Xlibrary

OptionExplicit

DimmConnAsADODB.Connection

Dimrs1AsADODB.Recordset

Dimrs2AsADODB.Recordset

Dimrs3AsADODB.Recordset

Dimrs4AsADODB.Recordset

DimcmdAsADODB.Command

DimparamAsADODB.Parameter

'这里用第一种方法使用存储过程添加数据

PrivateSubCommand1_Click()

Setcmd=NewADODB.Command

Setrs1=NewADODB.Recordset

cmd.ActiveConnection=mConn

cmd.CommandText="insert_users"

cmd.CommandType=adCmdStoredProc

Setparam=cmd.CreateParameter("truename",adChar,adParamInput,20,Trim(txttruename.Text))

cmd.Parameters.Appendparam

Setparam=cmd.CreateParameter("regname",adChar,adParamInput,20,Trim(txtregname.Text))

cmd.Parameters.Appendparam

Setparam=cmd.CreateParameter("pwd",adChar,adParamInput,20,Trim(txtpwd.Text))

cmd.Parameters.Appendparam

Setparam=cmd.CreateParameter("sex",adChar,adParamInput,20,Trim(txtsex.Text))

cmd.Parameters.Appendparam

Setparam=cmd.CreateParameter("email",adChar,adParamInput,20,Trim(txtemail.Text))

cmd.Parameters.Appendparam

‘下面的类型需要注意,如果不使用adSingle,会发生一个精度无效的错误

Setparam=cmd.CreateParameter("jifen",adSingle,adParamInput,50,Val(txtjifen.Text))

cmd.Parameters.Appendparam

Setrs1=cmd.Execute

Setcmd=Nothing

Setrs1=Nothing

EndSub

'这里用第二种方法使用存储过程添加数据

PrivateSubCommand2_Click()

Setrs2=NewADODB.Recordset

Setcmd=NewADODB.Command

cmd.ActiveConnection=mConn

cmd.CommandText="insert_users"

cmd.CommandType=adCmdStoredProc

cmd.Parameters("@truename")=Trim(txttruename.Text)

cmd.Parameters("@regname")=Trim(txtregname.Text)

cmd.Parameters("@pwd")=Trim(txtpwd.Text)

cmd.Parameters("@sex")=Trim(txtsex.Text)

cmd.Parameters("@email")=Trim(txtemail.Text)

cmd.Parameters("@jifen")=Val(txtjifen.Text)

Setrs2=cmd.Execute

Setcmd=Nothing

Setrs1=Nothing

EndSub

'这里用第三种方法使用连接对象来插入数据

PrivateSubCommand4_Click()

DimstrsqlAsString

strsql="insert_users'"&Trim(txttruename.Text)&"','"&Trim(txtregname.Text)&"','"&Trim(txtpwd.Text)&"','"&Trim(txtsex.Text)&"','"&Trim(txtemail.Text)&"','"&Val(txtjifen.Text)&"'"

Setrs3=NewADODB.Recordset

Setrs3=mConn.Execute(strsql)

Setrs3=Nothing

EndSub

'利用存储过程显示数据

‘要处理多种参数,输入参数,输出参数以及一个直接返回值

PrivateSubCommand3_Click()

Setrs4=NewADODB.Recordset

Setcmd=NewADODB.Command

cmd.ActiveConnection=mConn

cmd.CommandText="select_users"

cmd.CommandType=adCmdStoredProc

'返回值

Setparam=cmd.CreateParameter("RetVal",adInteger,adParamReturnValue,4)

cmd.Parameters.Appendparam

'输入参数

Setparam=cmd.CreateParameter("regname",adChar,adParamInput,20,Trim(txtregname.Text))

cmd.Parameters.Appendparam

'输出参数

Setparam=cmd.CreateParameter("numrows",adInteger,adParamOutput)

cmd.Parameters.Appendparam

Setrs4=cmd.Execute()

Ifcmd.Parameters("RetVal").Value=1Then

MsgBoxcmd.Parameters("numrows").Value

Else

MsgBox"没有记录"

EndIf

MsgBoxrs4.RecordCount

SetDataGrid1.DataSource=rs4

DataGrid1.Refresh

EndSub

'连接数据库

PrivateSubForm_Load()

SetmConn=NewConnection

mConn.ConnectionString="Provider=SQLOLEDB.1;PersistSecurityInfo=False;UserID=sa;InitialCatalog=Test;DataSource=yang"

mConn.CursorLocation=adUseClient'设置为客户端

mConn.Open

EndSub

'关闭数据连接

PrivateSubForm_Unload(CancelAsInteger)

mConn.Close

SetmConn=Nothing

EndSub

->