再看数据库——(1)存储过程

时间:2021-11-15 14:04:02

      当我们执行一个比较简单的操作时,一般都是用SQL语句。但是当逻辑越来越复杂时,仅仅使用顺序执行的SQL语句序列表现出很大的局限性。这时,就可以考虑用另一种方法了,那就是存储过程。

      现在数据库系统往往采用客户机/服务器计算模式,很多工作可以在客户端完成,也可以在服务器端完成。客户机/服务器系统与传统的数据库系统的一个很重要的区别是,在传统的数据库系统中只存放数据,所有的应用程序都在用户端,都与用户实际运行的应用程序捆绑在一起;而客户机/服务器系统中,在数据库中还存放程序,由于这种程序以数据库对象的形式存储在数据库中,因此称为存储过程。


建立存储过程:


再看数据库——(1)存储过程


存储过程的一般结构:

再看数据库——(1)存储过程


应用例子:

向NiuNan数据库的news表中增加一条记录。

news表中的字段有:

再看数据库——(1)存储过程

编写相应的存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		牛腩
-- Create date: 二〇一四年四月三日 15:06:13
-- Description:	增加新闻
-- =============================================
CREATE PROCEDURE [dbo].[news_Insert]
--定义变量
@title varchar(100),@content text,@caid int
AS
BEGIN
--插入语句
	INSERT INTO news(title, [content], categoryId)
VALUES   (@title,@content,@caid)
END

执行存储过程之后,可以验证一下.

exec news_Insert "娱乐新闻","《爸爸去哪儿2》杨阳洋多多贝儿 帅爸萌娃大比拼 ",4


添加成功!

再看数据库——(1)存储过程


在C#中调用存储过程:

 #region  增加新闻
   
        /// <summary>
        /// 增加新闻
        /// </summary>
        /// <param name="n">新闻实体类</param>
        /// <returns></returns>
        public bool Insert(News n)
        {
            //TODO:增加新闻
            bool flag = false;
            //存储过程名为"news_Insert"
            string cmdText = "news_Insert";
            //给变量赋值
            SqlParameter[] paras = new SqlParameter[]{
            new SqlParameter ("@content",n.content),
            new SqlParameter ("@title",n.title ),
            new SqlParameter ("@categoryId",n.categoryId )};
            
            //执行sqlHelper,CommandType为存储过程类型
            int res = sqlhelper.ExecuteNonQuery(cmdText, paras, CommandType.StoredProcedure);
            if (res > 0)
            {
                return true;
            }
            return flag;
        }

        #endregion

使用存储过程有很多优点:

       1、提高运行速度。在运行之前,存储过程的语法和语义分析工作已经完成,当调用时,其执行的SQL语句的大部分准备工作已经完成。对比之下,交互执行的SQL语句时解释执行的,它的速度就比较慢了。

       2、增强了SQL的功能和灵活性。存储过程可以用流程控制语句编写,有很强的灵活性,能完成复杂的逻辑判断和复杂的运算。

       3、可以降低网络的通信量。在前面已经提到,存储过程存储在服务器端,执行全部逻辑流程仅需要向服务器发送一次过程请求即可。

      4、减轻了程序编写的工作量,这个事显而易见的。

      5、间接实现安全控制功能。可以授权某些用户执行某个存储过程来完成允许范围内的信息查询,而不直接在表和视图上进行查询。

当然,它也会有一些缺点:

      SQL本身是一种结构化查询语言,加上了一些控制(赋值、循环和异常处理等),但不是OO的,本质上还是过程化的,面对复杂的业务逻辑,过程化的处理会很吃力。还存在不便于调试,没办法应用缓存和无法适应数据库的切割(水平或垂直切割)等问题。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。


系列博客推荐:

再看数据库——(1)存储过程

再看数据库——(2)视图

再看数据库——(3)触发器