`
yanfaguanli
  • 浏览: 663763 次
文章分类
社区版块
存档分类
最新评论

存储过程介绍以及使用(转账,分页)

 
阅读更多

课堂上老师让人报名讲课,在“触发器”、“存储过程”、“数据库连接”中选择一个内容,那时还没学过“触发器”和“存储过程”,所以我报名要讲“存储过程”。

然后花了两个星期,有空就查查资料,测试代码,应该也算是理解了大概了吧。

成果有:1.简单的PPT介绍存储过程;2.数据库创建、运行“存储过程”;3.应用程式连接数据库调用存储过程

下面按照我在课堂上讲的PPT流程写下文字教程,希望大家对存储过程有个整体的认识。

一:简介

存储过程确实像是高级语言中的“方法”、“函数”,里面可以封装很多的SQL语句等代码,这些代码联合起来会实现某个功能,即某个需求。若一存储过程完成对某功能的封装后,就像一个盒子,外部想使用它的时候,无需关心内部的代码,只需把调用该盒子,将一些参数传进去(可以没有参数)。存储过程在内部运行,操作数据库数据,然后可以有返回值送回给它的调用者。

二:优缺点

存储过程确实有不少优点!

1.运行速度快。

但当时只知道并不是因为它的执行速度快,对“体现在预编译”也没什么理解。还好讲课后有同学问到,然后老师调拨了下:当客户端第一次调用该存储过程时,数据库会进行编译等操作,然后把“过程”存到内存中,这第一次会比较慢。当客户端(可以是不同的客户端)之后再次调用该存储过程时,便是直接从内存中执行,从而速度比较快。

2.可以降低网络通信量

为什么可以可以降低网络通信量?一开始我也是摸不着头脑,和“客户端直接写SQL语句”相比,同样都差不多是发送一个请求去数据库,同样数据库可能返回一个结果集,到底在哪个方面上可以降低了网络通信量?

后来找到了一个例子,焕然大悟。这个例子就是“有分页功能”的存储过程。可以想象一下,如果有一张表有100万行数据,如果在客户端写一条SQL语句让这100行数据抓回客户端,然后再写个for循环让它们分页显示,这得消耗多大的系统资源啊!

现在有了存储过程,就可以让客户端把“每页要显示的行数”和“第几页”的参数传到数据库的存储过程,存储过程再去获取对应的页面的数据,然后在把该页数据返回给客户端。这样降低的网络通信量将是大大的!

除此之外,还有一些挺不错的优点

3.提高安全性

因为客户端只是发送一个调用某存储过程的命令到服务器,这时就算该信息被截取了,对方也不知道该存储过程是做了什么事。

4.便于集中控制。

像一些可能要经常改变运算规则的运算放到存储过程中,需要修改时对存储过程进行修改就行。打个比方,一个数据库,多个客户端,如果不使用存储过程,修改操作数据库的SQL语句时,就要更新修改所有客户端。

缺点不多,但肯定有,不然全部用存储过程来处理数据好了呵呵。但暂时不能很好的体会,就不乱写了……

三:实例需求

这里有个叫ATM的数据库,里面有一张T_Users的表,里面存在ID、姓名、余额的信息

简单的转账功能:即A向B转账金额c,A的余额减去c,B的余额加上c

分页:即显示某页面的数据

四:实例流程

这张图表示了数据库向应用程序返回数据的两个方式。后来老师提到,我应该多画几个“应用程序”,体现下存储过程的便利。如果不使用存储过程,那应用程序有时要完成某个个功能,将不知一次地向数据库发送请求。比如,有可能要去获取一个数据到应用程序进行判断,符合条件了,再发送另一个执行命令到数据库。而采用存储过程,则直接调用存储过程即可,它在里面判断是否符合条件后进行不同操作返回不同的值给应用程序。

五:演示(这里使用的SQL Server 2008 + VS2010 的C# & WPF & ADO.NET)

1.数据库创建一个存储过程:

在数据库ATM中,新建查询,执行以下代码

Create procedure TransferAccounts (@fromId int, @money decimal, @toId int)
 As
 --如果(余额>转账)的代码省略
 --委托的代码省略
 begin  --begin~end相当于高级语言的  {  }
  update T_Users set Balance = Balance - @money where Id = @fromId
  update T_Users set Balance = Balance + @money where Id = @toId
  return 1 --返回值
 end
 Go

2.数据库可视化编辑一个存储过程:

目录位置:数据库--ATM--可编程性--存储过程,会看到TransferAccounts 。右键点击它,可以修改、删除等操作

3.数据库可视化执行一个存储过程:

右键点击TransferAccounts,编写存储过程脚本为--Execute 到 新查询编辑器窗口

DECLARE @RC int
DECLARE @fromId int
DECLARE @money decimal(18,0)
DECLARE @toId int

-- TODO: 在此处设置参数值。
set @fromId = 1
set @toId = 2
set @money = 100

EXECUTE @RC = [ATM].[dbo].[TransferAccounts] 
   @fromId
  ,@money
  ,@toId
GO

(浅蓝色部分为手动添加的参数值)

执行之后,结果正确

4.程序连接数据库执行一个存储过程:

这里就只能简单说下了。

首先在SQLHelper中编写一个执行的存储过程的方法

public static bool ExecuteProcedure(string procedureName, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = procedureName;
                    cmd.CommandType = CommandType.StoredProcedure;  //修改命令为执行存储过程!!!!!!
                    parameters[3].Direction = ParameterDirection.ReturnValue; //设置第四个参数为返回参数(为了测试方便就直接设置了)
                    cmd.Parameters.AddRange(parameters); //添加参数
                    cmd.ExecuteNonQuery(); //执行存储过程!!!!!!!!
                    int theReturn = (int)parameters[3].Value;  //接收返回值
                    if (theReturn == 1)  //bool类型在数据库为bit,返回值为 0 或 1
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }


界面层中调用一个存储过程

private void btConfirm_Click(object sender, RoutedEventArgs e)
        {
            int fromId = Int32.Parse(txtFromId.Text);
            int money = Int32.Parse(txtMoney.Text);
            int toId = Int32.Parse(txtToId.Text);
            bool isSuccessed=false;

            isSuccessed = SqlHelper.ExecuteProcedure("TransferAccounts",
                new SqlParameter("@fromId", fromId),
                new SqlParameter("@money", money),
                new SqlParameter("@toId", toId),
                new SqlParameter("@isSuccessed",0));

            MessageBox.Show("" + isSuccessed);

        }


5.最后说下数据库可视化执行分页的存储过程

同样的,先创建

Create procedure Paging (@pageSize int, @pageIndex int)  --参数:每页显示的行数,页数的索引
 As
 begin with tempTable as(Select ROW_NUMBER() over(order by Id) as row, * from T_Users)  --临时表,按Id排序,首列(row),记录所在行数
  Select * from tempTable where row between (@pageIndex-1)*@pageSize + 1 and @pageIndex*@pageSize
 End


本教程到此为止,有错误的地方希望得到指正^_^

参考资料:

专题http://tech.ccidnet.com/zt/guocheng/
http://www.cnblogs.com/kkcheng/archive/2010/03/19/1689672.html
c#调用存储过程http://www.2cto.com/kf/201107/98150.html

分享到:
评论

相关推荐

    Java_JDBC由浅入深

    9.2 有参无返回值存储过程调用 63 9.3 有参有返回值存储过程调用 64 9.4 JDBC其他API 65 第十一节 元数据信息 66 11.1 数据库元数据信息 66 11.2 参数元数据信息 67 第十二节 批处理的使用 67 12.1 普通方式插入一千...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例231 文本文件的分页读取 298 4.4 文件操作 300 实例232 文件操作汇总 300 实例233 目录、文件定位器 302 实例234 改头换面 303 实例235 文件属性分析 304 实例236 文件类型检测 306 实例237 判断文件的权限 308 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例231 文本文件的分页读取 298 4.4 文件操作 300 实例232 文件操作汇总 300 实例233 目录、文件定位器 302 实例234 改头换面 303 实例235 文件属性分析 304 实例236 文件类型检测 306 实例237 判断文件的权限 308 ...

    C#程序开发范例宝典(第2版).part08

    实例081 DataGridView控件的分页功能 108 实例082 从DataGridView控件拖放数据至TreeView控件 113 实例083 在DataGridView控件中实现合并单元格 116 实例084 在DataGridView控件中显示图片 118 实例085 为...

    C#程序开发范例宝典(第2版).part13

    实例081 DataGridView控件的分页功能 108 实例082 从DataGridView控件拖放数据至TreeView控件 113 实例083 在DataGridView控件中实现合并单元格 116 实例084 在DataGridView控件中显示图片 118 实例085 为...

    C#程序开发范例宝典(第2版).part02

    实例081 DataGridView控件的分页功能 108 实例082 从DataGridView控件拖放数据至TreeView控件 113 实例083 在DataGridView控件中实现合并单元格 116 实例084 在DataGridView控件中显示图片 118 实例085 为...

    C#程序开发范例宝典(第2版).part12

    实例081 DataGridView控件的分页功能 108 实例082 从DataGridView控件拖放数据至TreeView控件 113 实例083 在DataGridView控件中实现合并单元格 116 实例084 在DataGridView控件中显示图片 118 实例085 为...

    C#.net_经典编程例子400个

    142 3.6 Process组件 143 实例102 使用Process组件访问本地进程 143 3.7 Timer组件 145 实例103 使用Timer组件制作计时器 145 实例104 使用Timer组件显示当前系统时间 150 实例105 ...

    C#编程经验技巧宝典

    14 <br>0028 “///”符号的使用技巧 14 <br>0029 使用注释取消程序语句的执行 15 <br>2.2 语句 15 <br>0030 跳转语句GOTO的使用 15 <br>0031 Continue语句的使用 16 <br>0032 Break...

Global site tag (gtag.js) - Google Analytics