机房收费系统重构之存储过程的使用,收费系统重构
从一开始对于机房收费系统的无从下手,到现在已经接近尾声,像冬天的迷雾一样,随着时间散开了去,对于其也是越来越清晰,想一想,这种学习的过程还真是美妙。
当然只学习不去总结是没有意义的。今天我就来把存储过程的使用总结一下。拿用户注册来说,就是往数据库里添加用户,以方便更多的用户使用。那么用户注册我们要注意到什么呢?
1.通过卡号判断用户是否已经存在。
如果不存在该用户:
2.将信息写入学生表。
3.更新充值记录表
4、更新卡表中的余额。
我们分析可以得到,如果不存在该用户,我们需要同时改动三个表。当然,你可以去一条一条的去写,但是这种做法不是我们想要的,今天是三个表,下次是三十个表,你还一条一条的写?所以在这里我们就引入了存储过程。
一、什么是存储过程呢?
定义:将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊?Microsoft公司为什么还要添加这个技术呢?
那么存储过程与一般的SQL语句有什么区别呢?
二、存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
三、存储过程的种类:
1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息
2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能
3.用户自定义的存储过程,这是我们所指的存储过程
常用格式
create proceduresp_name
@[参数名] [类型],@[参数名] [类型]
as
begin
.........
end
四、调用存储过程
1.基本语法:exec sp_name [参数名]
五、删除存储过程
1.基本语法:
drop procedure sp_name
2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。
就好比机房收费系统中注册中用到的:
CREATE PROCEDURE [dbo].[PROC_Register] @cardNo char(10),@studentNo char(10),@name ntext,@sex nchar(10),@department char(10),@grade nchar(10),@classgrade nchar(10), @cash decimal(18,2),@cardStatue char(16),@cardType char(8), @chargeMoney decimal(10,4),@chargeDateTime datetime,@userName char(10), @statue ntext,@registerDateTime date,@checkStatue char(10) AS BEGIN --添加卡表 insert into T_CardInfo (cardNo ,studentNo ,cardStatue ,cash,cardType ,registerDateTime ,userName ,checkStatue ) values (@cardNo ,@studentNo ,@cardStatue ,@cash,@cardType ,@registerDateTime ,@userName ,@checkStatue ) --添加到学生表 insert into T_StudentInfo (studentNo ,name ,sex ,department ,classgrade ,statue ,grade ) values (@studentNo ,@name ,@sex,@department,@classgrade ,@statue,@grade) --添加到充值记录表 insert into T_Recharge (cardNo ,chargeDateTime ,chargeMoney ,userName ) values (@cardNo ,@chargeDateTime,@chargeMoney,@userName) END这样就可以轻松的操作在三个表中,当然存储过程远远不止这些,并且在以后学习中,我们还会继续研究。
像我们需要修改三张表一样,当一件同样的事情,需要我们来做三次,我们就要敢于去想一个比较高效的办法,像我之前就没有去想的这样一件事情,所以,我们还要去敢想,因为不知道有多少人在我们敢想之前做了出来。
zhidao.baidu.com/question/21454140.html
此类不能被继承。我觉得这个类就是起到一个桥梁的作用。他连接.NETt和SQL Server;将我们在客户端设置的sql语句传递给sql;再将sql的值传递给客户端
这个类中定义了很多的方法和属性来帮助我们完成不同的sql语句;总结三种在机房收费系统中用到的方法
第一种方法:ExecuteScalar
作用: 执行查询返回值: 返回查询所返回的结果集中第一行的第一列。 忽略其他列或行。System.Object 结果集中第一行的第一列;如果结果集为空,则为空引用(在 Visual Basic 中为Nothing)适用情况: 使用ExecuteScalar 方法从数据库中检索单个值(例如一个聚合值)。与使用 ExecuteReader 方法,然后使用 SqlDataReader 返回的数据执行生成单个值所需的操作相比,此操作需要的代码较少。 示例代码:
在VB.NET中从数据库中取出单个值----使用从recharge求和的语句和
Imports System.Data ' 创建表类型的变量需要引用的空间 Imports System.Data.SqlClient '创建sql数据库连接需要引用的空间 Imports Entity Imports DateBaseHelper Public Class ConsumeInfoDAL '得到T_Recharge中全部的充值金额 Public Function GetBlance(ByVal strID As String, ByVal consumeCash As String) As String '设置传入sql中的T_SQL语句:获得充值的全部金额 Dim strRecharge As String = "SELECT SUM(cast(RechargeCash as int )) FROM T_RechargeInfo where CardID ='" + strID + "' " '打开数据库 执行上面的sql语句得到结果 关闭数据库 Dim con As New DBHelper Dim recharge As String con.Open() '需要处理如果表中没有记录那么返回的是false '如果返回false 充值为0 If con.ExecutesqlScalar(strRecharge) = False Then recharge = " 0" Else recharge = con.ExecutesqlScalar(strRecharge) End If con.Close() '返回结果 Return recharge End Function End Class DBHelper类,将对数据库的常用操作定义成了方法Imports System.Data Imports System.Data.SqlClient Imports System.Data.OleDb Imports System.Text Imports System.Configuration Imports Entity Public Class DBHelper Private myConnection As New SqlConnection '表示数据连接控件 Private CmdString As String '表示SQL语句命令 Priva......余下全文>>