使用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
->