存储过程

来源:互联网 发布:seo怎么推广 编辑:程序博客网 时间:2024/06/14 05:27

定义

    一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

    即:为了完成特定功能,预先用SQL语句写好并经编译存储在数据库中。(存储过程为封装此代码提供了一个替换位置。)


种类

    常用的
    系统存储过程。一般以sp_开头,用于系统各项设定取得信息、相关管理工作。
    本地存储过程。一般所说的存储过程就是本地存储过程。(用户创建并完成某一特定功能的存储过程)

如何用


    以机房收费系统的注册为例

    1、创建存储过程:myCharge_DB——可编程性——存储过程 右键新建存储过程。在里面填代码:

<span style="font-family:KaiTi_GB2312;font-size:24px;">Create PROCEDURE [dbo].[pro_Register]    -- Add the parameters for the stored procedure here    @Cardno char(10),    @Studentno char(11),    @Studentname char(10),    @Sex char(6),    @Department char(10),    @Grade char(10),    @Class char(10),    @Explain varchar(50),    @IsCheck char(10),    @Type char(10),    @Cash numeric(18,1),    @Date date,    @UserID char(10),    @Status char(10),    @Time time(0)ASBEGIN     insert into T_Student_Info(Cardno,Studentname,Studentno,Sex,Department,Grade,Class,Cash,Explain,IsCheck,UserID,Type,Status,date,time  )values(@Cardno ,@Studentname,@Studentno,@Sex,@Department,@Grade,@Class,@Cash,@Explain,@IsCheck,@UserID,@Type,@Status,@Date ,@Time)         insert into T_Recharge_Info(Cardno,Studentno,Addmoney,Date,UserID,Status,Time)values(@Cardno,@Studentno,@Cash,@Date,@UserID,@Status,@Time)END</span>

    存储过程名称为:pro_Register
    调用时在D层

<span style="font-family:KaiTi_GB2312;font-size:24px;">Dim sql As String        sql = "PRO_Register" '调用存储过程        Dim sqlParams As SqlParameter() =            {New SqlParameter("@Studentno", registeredEntity.StudentNo),        New SqlParameter("@Studentname", registeredEntity.StudentName),        New SqlParameter("@Cash", registeredEntity.Cash),        New SqlParameter("@Class", registeredEntity.ClassNo),        New SqlParameter("@Department", registeredEntity.Department),        New SqlParameter("@Explain", registeredEntity.Explain),        New SqlParameter("@Grade", registeredEntity.Grade),        New SqlParameter("@IsCheck", registeredEntity.IsCheck),        New SqlParameter("@Sex", registeredEntity.Sex),        New SqlParameter("@Status", registeredEntity.Status),        New SqlParameter("@Type", registeredEntity.Type),        New SqlParameter("@Date", Date.Today),        New SqlParameter("@Cardno", registeredEntity.CardNo),        New SqlParameter("@UserID", registeredEntity.UserID),        New SqlParameter("@Time", registeredEntity.Time)}        Dim flag As New Boolean        flag = sqlHelper.NoReturn(sql, CommandType.StoredProcedure, sqlParams)        Return flag</span>
    2、调用存储过程
       基本语法:exec sp_name [参数名]
    3、删除存储过程
       (1)基本语法:drop procedureprocedure_name[参数名]
       (2)注意事项
        不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
    4、修改存储过程
       基本语法:Alter procedure procedure_name[参数名]

优点

    1、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
    2.当对数据库进行复杂操作时(如注册,需要对student和recharge表进行Insert或者更复杂的操作Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
    3、降低网络流量提高性能
    4、提供单点维护

常见问题

    1、

    解决办法:
        (1)存储过程调用错了(一般是存储过程名字字母错误)。
        (2)用户创建的存储过程与系统存储过程同名。如果以sp开头,用户创建的存储过程,总会先检查master数据库(即使该存储过程已用数据库名称限定)。  如果用户创建的存储过程与系统存储过程同名,则永远不执行用户创建的存储过程 ,因此自定义存储过程不要与系统存储过程同名
        (3)超过指定的参数。以上情况你的代码中均没有出现,目前最大的可能性是你连接的数据库中存储过程中的参数确实没有那么多,而你改的是另一个数据库中的存储过程! 

    2、在存储过程中编写时总是提示列名无效或者在代码中也报错显示缺少@time等。
       解决方案:存储过程中的列名要和数据库、代码中的都一致,不然也会报错;这里就要细心了,不要丢,还要区分大小写。

    3、还是上图,显示:找不到存储过程。
       解决方案:
       (1)当前数据库内根本没有此存储过程,或存储过程名称错误
       (2)当前数据库不对,连接到其他数据库
       (3)你还未安装数据库,或未附加正确的数据
       (4)你的用户对当前数据库没有操作权限

0 0
原创粉丝点击