探索--SQL存储过程(一)

来源:互联网 发布:acg音乐知乎 编辑:程序博客网 时间:2024/05/19 17:58

         在之前学SQL Server的时候学到了存储过程,当时只知道存储过程是什么,但是没有用过,从12年的8月份开始到现在,经过了很久的时间才对存储过程有了一点自己的理解,下面分享一下:

        首先,要想什么是存储过程?存储过程简单来说就是为以后的使用而保存的一条或多条SQL语句的集合,可以将它简单的想做批文件(但是比批文件强大的多)

         然后,要想为什么要使用存储过程?就是使用存储过程之后有什么优点?第一:它把处理封装在容易使用的单元中,能简化复杂的操作;第二:因为少了重复的复杂操作,保证了数据的一致性,防止错误.第三:因为存储过程是封装的处理操作,如果表名或列名,业务逻辑变化了,那么只需要更改存储过程的代码,使用它的人员不需要改变其他的代码;第四:因为存储过程通常以编译过的形式存储,所以DBMS为处理命令所做的工作较少,因此提高了性能;概括来说:简单、安全、高性能。

        我们举个我们熟悉的机房收费系统中,插入上机记录的存储过程简单的小例子,体会一下存储过程的使用,如下:

        先在DBMS中创建存储过程,我们用的Microsoft SQL Server,代码如下:

CREATE PROCEDURE PROC_InsertUpRecord @cardno INTEGER,@name varchar(50),@room varchar(50),@comment varchar(50)ASINSERT INTO T_UpRecord(CardNo ,Name ,[UpDate] ,UpTime  ,Room ,Comment )VALUES(@cardno ,@name,CONVERT(varchar(100), GETDATE (), 23),GETDATE (),@room ,@comment )


 

                

以上代码是写在SQL Server中的,那么我们写好了存储过程,如何在VS中调用呢?我们来实践一下,因为我们需要的参数都是从界面层传回来的,B层写的是逻辑,D层是数据层,我们把代码写在了D层:

'*********************************************   '说明:此函数用来向上机表中插入记录'创建日期:2012-12-30 '版本:1.0 '********************************************    Public Sub InsertUpRecord(mUpRecord As Model.UpRecord, mStuInfo As Model.StuInfo)          '传参       Dim params() As SqlParameter = {New SqlParameter("@cardno", mStuInfo.CardNo), New SqlParameter("@name", mStuInfo.Name), New SqlParameter("@room", mUpRecord.Room), New SqlParameter("@comment", mUpRecord.Comment)}            '调用Update方法执行        Call dExecute.Update("PROC_InsertUpRecord", params)    End Sub

 

        因为Update方法很常用所以把它抽出来,我们看Update方法:

    '*********************************************    '作者:***    '说明:此函数用来修改数据库表的选定记录    '创建日期:2012-12-23    '版本:1.0    '********************************************    Public Sub Update(strProName As String, params() As SqlParameter)        '连接数据库                       Dim cn As New SqlConnection        cn.ConnectionString = "Server=.;DataBase=CRCS;UID=sa;pwd=123456"                cn.Open()        '传递参数并执行        Dim cmd As New SqlCommand        cmd.Connection = cn        cmd.CommandText = strProName        cmd.CommandType = CommandType.StoredProcedure        cmd.Parameters.AddRange(params)        cmd.ExecuteNonQuery()        cn.Close()    End Sub

      

             update方法其实就是连接数据库,并执行操作的一个方法。

            下面想一想,如果我们不用存储过程,代码应该怎么写?

 

    '*********************************************    '作者:***                                                                            '说明:此函数用来向上机表中插入记录    '创建日期:2012-12-30    '版本:1.0    '********************************************    Public Function InsertUpRecord(mUpRecord As Model.UpRecord, mStuInfo As Model.StuInfo)        '定义SQL字符串        Dim strSQL As String        strSQL = "insert into T_UpRecord values(" & " '" & mStuInfo.CardNo & "'" & "," & "'" & mStuInfo.Name & "'" & "," & "'" & mUpRecord.Update & "'" & "," & "'" & mUpRecord.UpTime & "'" & "," & "null" & "," & "null" & "," & "null" & "," & "null" & "," & "'" & "正在上机" & "'" & ")"           '调用Update执行操作             Call Update(strSQL)    End Function

            比较一下两种代码,体会一下上面所说的存储过程的优点。现在是小系统感觉可能没那么明显,但是如果是大系统呢?不用存储过程的话,我们需要写N多条SQL语句,每次用的时候都要执行,那么可想而知,效率不高,而且直接输入字符串的话,一些符号经常容易出错,比如单引号等;但存储过程是以编译过的形式存储,所以DBMS为处理命令所做的工作较少,效率大大的提高,并且可以减少出错的几率;如果表中字段的名称更改了,不用存储过程的话需要改VS中的代码,不容易修改,但是用存储过程的话,只需要修改存储过程的代码就可以搞定了。

        如此,我们实现了存储过程在vs中最基础的调用。关于存储过程,这只是冰山一角,存储过程的知识还有很多,正在一步步探索前进的道路!