需求介绍:
现在正在开发的机房收费系统,总得来说,是对学生上机进行收费管理(没有要在学校开网吧的意思啊!为了学习面开发的)大体的功能是这样的:学生上机,然后刷卡,下机的时候,再刷卡,然后通过对学生的上机时间收取相应的费用,同时,该系统还可以统计与维护学生的基本信息、上机记录、学生注册、充值、退卡等功能。
其中有一个功能是学生注册,功能:注册学生的基本信息,同时可以在该学生帐户下存入一定的金额。
解决思路与办法:
因为,要学生注册信息的同时要对学生帐户进行充值,所以说要涉及到两个表的操作。一个是学生的基本信息表:student,还有一个是学生的充值记录表:RechargeRecord。可以想到,如果学生注册成功,那么,必须要向充值表中写入相应的充值记录,所以,我的解决办法,是用事务来实现。因为事务是原子性,可以要么都做,要么都不做。就算是写入到了学生的基本信息表,但是充值表中没有写入记录,也是注册不成功。
所以,我把事务写成了存储过程,让应用程序来调用:
下面是我的存储过程:
- USE [ChargeSystem]
- GO
- /****** 对象: StoredProcedure [dbo].[StudentRegister] 脚本日期: 02/11/2012 14:30:08 ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author: <Author,,Name>
- -- Create date: <Create Date,,>
- -- Description: <Description,,>
- -- =============================================
- ALTER PROCEDURE [dbo].[StudentRegister]
- -- Add the parameters for the stored procedure here
- @CardNO varchar(10),
- @StudentNO varchar(20),
- @StudentName nvarchar(10),
- @Sex nvarchar(2),
- @STClass nchar(2),
- @Grade nchar(3),
- @Specialty nvarchar(50),
- @Amount numeric(5,1),
- @Status nvarchar(3),
- @UserType nchar(4),
- @Remarks nvarchar(50),
- @RechargeTime datetime,
- @Teacher nvarchar(50)
- AS
- BEGIN
- -- SET NOCOUNT ON added to prevent extra result sets from
- -- interfering with SELECT statements.
- SET NOCOUNT ON;
- -- Insert statements for procedure here
- declare @Transaction_name varchar(32)
- select @Transaction_name='my_transaction_register'
- begin Transaction @Transaction_name
- insert into students values(@CardNO,@StudentNO,@StudentName,@Sex,@STClass,@Grade,@Specialty,@Amount,@Status,@UserType,@Remarks)
- insert into RechargeRecord values(@CardNO,@StudentNO,@StudentName,@RechargeTime,@Amount,@Teacher)
- commit transaction
- return @@error
- END
其中用@@error来取得执行结果