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

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

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

建立存储过程:

存储过程的一般结构:

应用例子:

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

news表中的字段有:

编写相应的存储过程:

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

添加成功!

在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)存储过程,布布扣,bubuko.com

时间: 2024-10-08 10:29:13

再看数据库——(1)存储过程的相关文章

机房收费系统合作——再看数据库设计

机房合作我负责了最简单的D层,接口层,工厂层.反正D层是我来写,于是数据库索性也就顺便设计了.已经是第三次敲机房收费系统了,每次都是相隔半年左右吧.需求搞得透透的了,数据库也就好设计了.基本跟第二次没什么大的区别,就是把Student表和Card表分开了. 重构的时候,我的数据库几乎什么都用到了:事务,存储过程,触发器,视图,联合查询等等.所以,这次设计数据库还是SO Easy的..并且,为了让婵婵和牛迁迁师哥写的方便,我把组合查询都写成了存储过程!!!!费了一番功夫,但是D层简单了不少.还记得

再看数据库——(7)游标

背景: 其实<再看数据库>系列博客本没有计划写这么多,但最近确实接触数据库比较多,又接触了这些东西,在之前很少用到,因此就整理下,和大家分享. 简介: 游标,是一个数据缓冲区,用来存放SQL语句的执行结果.与一般的执行过程不同的是,游标是从结果集中每次提取一条记录. 与关系数据库的区别: 关系数据库--面向集合,一般执行结果都是一个集合,如果要选择其中一条或几条记录,就要用where子句. 游标     --面向单条记录.游标可以对查询语句返回的结果集中的每一行进行相同或不同的操作. 因此说,

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

概念: 触发器,顾名思义,它是由事件来触发的.比如当我们对表进行操作时就会激活它执行. 说到触发器,还要提一个关键点,那就是"保持数据完整性".什么意思呢?比如业务需求是,当我们注销一个卡号时,把该卡的充值.上机等信息也一并删除.这时如果是一个一个操作执行,就会是:注销卡--删除卡的充值信息--删除卡的上机信息(两个删除操作不分先后).这样做的弊端是,我们很容易把其中的一个步骤遗漏了,业务也不完整.用了触发器以后,当我们注销卡时激活触发器执行删除操作. 用触发器的好处就是很大程度上有利

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

概念 *是从用户使用数据库的观点来说的. *从一个或多个表(视图)中导出来的 *一个虚表,或者说查询表 为什么要用视图呢? 一是简单,看到的就是需要的.视图不仅可以简化用户对数据的理解,也可以简化他们的操作.那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件. 二是 安全,通过视图用户只能查询和修改他们所能见到的数据,但不能授权到数据库特定行和特定的列上.通过视图,用户可以被限制在数据的不同子集上:使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后

再看数据库——(4)事务

什么是事务?简单的说,就是你要做的或所做的事情.用术语表述是指访问并可能更新数据库中各种数据项的一个程序执行单元. 在数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序. 举个很经典的例子:从A账户向B账户转账.这个过程需要完成两个步骤:1)从A账户中减去钱:2)在B账户中加上相应的钱数.很简单,这两个步骤缺一不可.如果一旦出错,后果不堪设想.怎么办呢?这就引出了事务的用处. sql语句如下,当不出错时,提交事务转账成功.如果出错了,就执行回滚.数据库设计也很简单,一张money表

再看数据库——(6)连接

简单介绍: 连接是多表查询的基础. 因为关系数据库不包括指针或其它关联记录与记录的机制,连接成为了生成跨表数据关系的唯一机制. 这也就是要用连接的原因. 分类: 1.内连接 使用比較运算符比較被连接列的列值. 等值--"=" 不等--"="以外运算符 自然--"=",但它使用选择列表指出查询结果集合中所包含的列.并删除连接表中的反复列. 演示样例: 数据库中的两张表分别为dbo.Staff和dbo.Province. 注:dbo.Staff表中的

再看Cassandra 之NOSQL 数据库

Cassandra或许不会因为是NoSQL而得到关注,但是它在完成某些特定工作上,有迷人的魅力,这Netflix和Instagram两家公司一定知道. 过去的这些年,NoSQL的参与者,例如MongoDB已经得到了快速发展,受到了非常多的关注,但是 Apache Cassandra的光环褪去,作为创造了Cassandra的Facebook已经放弃了它,Cassandra的社区也好像过时了快.但 是Cassandra的命运迎来的转机,Netflix近来决心把他们自己的数据中心的oracle改成Ca

再看GS线程

再看GS线程 void GameServer::ProcessThreadTry() { int nCount = 0; packet rcvPkt; rcvPkt.data = new char[1024 * 100]; //该事件工厂主要创建了两个定时器1.livemgr的检测(即是否是有效的连接)2.道具帮会差异更新数据的获取即定时从道具帮会容器中获取差异需要保存到数据库的这个数据 //3.释放队列的处理,现在玩家下线不是直接把channel删除掉而是放到释放队列中等没有数据库访问时在删除

再看GS接包过程

再看GS接包过程 bool GameServer::ProcessLoop(packet& rPkt) { if(false == m_spDataLayer->Recv(rPkt)) return true;//没数据了 if(rPkt.is_data) { if(!rPkt.data) return false; GameChannel* pGC = m_vecChannel[rPkt.channel_id]; if(pGC) pGC->OnReceiveData(rPkt.dat