事宜实例

事务实例

 VB.NET代码

事务是并发控制的单位。是用户定义的一个操作序列,这些操作要么都做,要么一个也不做,不可分割的工作单位。

 通过事务,SQL server能将逻辑相关的一些操作绑定起来,以便服务器保持数据的完整性。在SQL server.NET的开发环境下,有两种方法完成事务的,

一个是存储过程,一个是在ADO.NET中一个简单的事务处理

下面以一个简单的存储过程中嵌套事务的操作为实例编写一个

基本语法格式如下

Create PROCEDURE [dbo].[Proc_名称] ---创建存储过程,定义几个变量

(

@Parameter1 varchar(12), @Parameter2 char(12)—定义变量

)

As  

Begin 

     Begin  Tran  -- 开始执行事物

        Delete from   table1 where name=’abc’;
         Insert into    table2 values(value1,value2,value3);

if @@error<>0 --判断如果两条语句有任何一条出现错误

rollback tran –开始执行事务的回滚,恢复的转账开始之前状态

return 0

end

go 

else   --如何两条都执行成功

commit tran 执行这个事务的操作

return 1

end

go


 

下面具体写一个小实例进行详细介绍

用上机充值为例子,学生充值卡号涉及两个表,一个是充值记录表,一个是更新学生信息表中的金额。

存储过程中事物代码如下

 

ALTER PROCEDURE [dbo].[PROC_Recharge] 

   @cash char(7),

   @cardID char(15),@userID varchar(15),@addMoney char(7),

   @rechargeDate char(20),@rechargeTime char(20),@statue char(15)

AS

BEGIN

   Set NOCOUNT ON; 

   Set XACT_ABORT ON;

   begin Tran--开始事物

   

   update T_StudentInfo set cash  =@cash where cardID =@cardID  --更新学生表的余额

   insert into T_Recharge(cardID,userID,addMoney,rechargeDate,rechargeTime ,statue  ) values(@cardID ,@userID ,@addMoney ,@rechargeDate ,@rechargeTime ,@statue  )

   

   declare @RegionError int 

   select @RegionError =@@ERROR 

   if (@RegionError =0) --判断如果两条语句都执行成功

   commit Tran --执行这个事务的操作

   else 

   RoLLBACK Tran --开始执行事务的回滚,    

END


界面窗体代码

 Imports Entity

Imports BLL

'''<summary>

'''充值窗体

'''</summary>

'''<remarks></remarks>

PublicClassfrmRecharge

 

   PrivateSub cmdOk_Click(senderAsObject, eAsEventArgs)Handles cmdOk.Click

       '变量定义

       Dim enRechargeAsNewRechargeEntity

       Dim enStudentAsNewStudentEntity

       Dim workRecordAsNewWorkRecordEntity

       Dim flagAsNewState.Statue'标志充值成功与否

       enStudent.CardID = txtCardID.Text

       enRecharge.CardID = txtCardID.Text

       enRecharge.AddMoney = txtCash.Text

       enRecharge.RechargeDate =Date.Today

       enRecharge.RechargeTime = TimeOfDay

       enRecharge.Statue ="未结账"

       enRecharge.UserID = frmLogin.txtUserName.Text'获取用户名

 

       '查询学生信息以及金额类

       Dim bllStudentAsNewStudentInfoBLL

       '将获得的数值相加

       enStudent.Cash =CLng(txtCash.Text) +CLng(bllStudent.QueryStudentInfo(enStudent).Rows(0).Item(6))

       '实例化充值金额类

       Dim bllRechargeAsNewRechargeInfoBLL

       '获取返回的充值标志

       flag = bllRecharge.AddRecharge(enRecharge, enStudent)

       Try

           '如果返回fail为不成功,success成功,lock金额不够

           If flag =State.Statue.failThen

               MsgBox("卡号不存在,请重新输入", vbOKOnly + vbExclamation,"提示")

           ElseIf flag =State.Statue.lockThen

               MsgBox("充值金额不能少于最少金额 " +CommonEntity._leastCash +" 元", vbOK + vbQuestion,"提示")

           ElseIf flag =State.Statue.successThen

               '显示充值信息

               lstShow.Items.Add("充值老师:" + frmLogin.txtUserName.Text)

               lstShow.Items.Add("充值卡号:" + enRecharge.CardID)

               lstShow.Items.Add("充值金额:" + enRecharge.AddMoney)

               lstShow.Items.Add("卡总共金额:" + enStudent.Cash)

               lstShow.Items.Add("充值日期:" + enRecharge.RechargeDate)

               MsgBox("充值成功", vbOK + vbInformation,"提示")

           EndIf

       Catch exAsException

       EndTry

   EndSub

EndClass

 

B层主要操作逻辑业务的代码如下

 

PublicClassRechargeInfoBLL

   '''<summary>

   '''增加充值记录方法,并修改学生余额

   '''</summary>

   '''<param name="enRecharge"></param>

   '''<param name="enStudent"></param>

   '''<returns></returns>

   '''<remarks></remarks>

   PublicFunction AddRecharge(enRechargeAsRechargeEntity, enStudentAsStudentEntity)AsInteger

       Dim iRechargeAsIRecharge

       Dim iStudnetAsIStudent

       Dim stundentAsNewDataTable

       Dim iDataBaseAsIDataBase

       Dim dataBaseAsNewDataTable

       Dim lestMoneyAsInteger

       iStudnet =FactoryDataSqlserver.CreateStudent()

       '实现工厂创建实例

       Try

           '调用接口方法

           '如果没有此学生返回fail,若充值金额少于最少金额返回lock,成功返回success

           stundent = iStudnet.QueryStudent(enStudent)

           If stundent.Rows.Count = 0Then

               ReturnState.Statue.fail

               '如果金额小于最少金额,锁定,否则充值成功

           ElseIf stundent.Rows.Count > 0Then

               iDataBase = FactoryDataSqlserver.CreateDataBase()

               dataBase = iDataBase.QueryDataBase()

               lestMoney = dataBase.Rows(0).Item(5)

               If enRecharge.AddMoney < lestMoneyThen

                   ReturnState.Statue.lock

               Else

                   iRecharge = FactoryDataSqlserver.CreateRecharge()

                   iRecharge.AddCardRecharge(enRecharge, enStudent)

                   ReturnState.Statue.success

               EndIf

           EndIf

       Catch exAsException

           Throw ex

       EndTry

EndFunction

End Class

 

D层主要实现接口层方法

 

Imports Entity

Imports SqlHelper

Imports [Interface]

Imports System.Data.SqlClient

 

PublicClassSqlRechargeDAL

   Implements [Interface].IRecharge

   '''<summary>

   '''增加充值信息方法

   '''</summary>

   '''<param name="enRecharge">参数实体类</param>

   '''<param name="enStudent">参数实体类</param>

   '''<returns>返回类型Boolean</returns>

   '''<remarks></remarks>

   PublicFunction AddCardRecharge(enRechargeAsRechargeEntity, enStudentAsStudentEntity)AsBooleanImplementsIRecharge.AddCardRecharge

       Dim sqlHelpareAsNew SqlHelper.sqlHelper

       Dim stroSQLAsString

       Dim sqlParmaeterAsSqlParameter()

       '定义参数集合

       sqlParmaeter =NewSqlParameter() {

                                            NewSqlParameter("@cash", enStudent.Cash),

                                            NewSqlParameter("@cardID", enRecharge.CardID),

                                            NewSqlParameter("@userID", enRecharge.UserID),

                                            NewSqlParameter("@addMoney", enRecharge.AddMoney),

                                            NewSqlParameter("@rechargeDate", enRecharge.RechargeDate),

                                            NewSqlParameter("@rechargeTime", enRecharge.RechargeTime),

                                            NewSqlParameter("@statue", enRecharge.Statue)

                                        }

       '存储过程名

        stroSQL ="PROC_Recharge"

       Try

           '执行带参数的存储过程

           Return sqlHelpare.ExecuteNoQuery(stroSQL,CommandType.StoredProcedure, sqlParmaeter)

       Catch exAsException

           Throw ex

       EndTry

EndFunction

End class

 

接口层代码

 

Imports Entity

'类名: IRecharge

'作者: 韩艳坤

'说明:IRecharge数据表接口

'创建日期:2013年3月10日

'**********************************************/

PublicInterfaceIRecharge

   '''<summary>

   '''增加学生充值方法

   '''</summary>

   '''<param name="enRecharge">参数实体类</param>

   '''<param name="enStudent">参数实体</param>

   '''<returns>返回值Boolean类型</returns>

   '''<remarks></remarks>

   Function AddCardRecharge(ByVal enRechargeAsRechargeEntity,ByVal enStudentAsStudentEntity)AsBoolean

End Interface

 

实体层 主要是获取数据库的字段 。这里就不再详细编写

 

对于Sqlhelper层的代码如下

 

Imports System.Data.SqlClient

Imports System.Configuration

Imports System.Data

Imports System.Collections

 

PublicClasssqlHelper

   '定义变量

   '获得数据库连接字符

   PrivateReadOnly strConnectionAsString =ConfigurationManager.AppSettings("strConnection")

   '定义连接

   Dim connAsSqlConnection =NewSqlConnection(strConnection)

   '定义连接命令

   Dim comdAsNewSqlCommand

 

   '''<summary>

   '''执行增删改三个操作,(有参)返回值为boolean类型,确认是否成功

   '''</summary>

   '''<param name="strSql">需要执行的语句,一般是Sql语句,也有存储过程</param>

   '''<param name="cmdType">命令类型(存储过程, T-SQL语句, 等等)</param>

   '''<param name="sqlParams">参数数组,无法确认有多少个参数</param>

   '''<returns>返回布尔类型,成功为true,否则为false</returns>

   '''<remarks></remarks>

   PublicFunction ExecuteNoQuery(ByVal strSql AsString,ByVal cmdTypeAsCommandType,ByVal sqlParamsAsSqlParameter())AsBoolean

       comd.Parameters.AddRange(sqlParams)'传入参数

       comd.CommandType = cmdType'传入语句类型

       comd.Connection = conn'设置连接

       comd.CommandText = strSql'设置查询语句

 

       Try

           conn.Open()'打开连接

           Return comd.ExecuteNonQuery()'执行增删改语句

           comd.Parameters.Clear()'清楚原有参数

 

       Catch exAsException

           ReturnFalse'如果出错,返回false提示

       Finally

           '判断数据库连接对象是否为断开状态,如果为连接则断开

           '判断数据库操作命令是否存在,若存在则销毁

           If conn.State =ConnectionState.OpenThen

               conn.Close()

           EndIf

           CloseCommand(comd)

           

       EndTry

 

   EndFunction

   '''<summary>

   '''行增删改三个操作,(无参)返回值为boolean类型,确认是否成功

   '''</summary>

   '''<param name="strSql">需要执行的语句,可能是一般语句,也可能是存储过程</param>

   '''<param name="cmdType">命令类型(存储过程, T-SQL语句, 等等</param>

   '''<returns>返回布尔类型,成功为true,否则为false</returns>

   '''<remarks></remarks>

   PublicFunction ExecuteNoQuery(ByVal strSql AsString,ByVal cmdTypeAsCommandType)AsBoolean

       comd.CommandType = cmdType

       comd.Connection = conn

       comd.CommandText = strSql

 

       Try

 

           conn.Open()'打开数据连接

           Return comd.ExecuteNonQuery()'返回执行增删改结果,受影响的行数

 

       Catch exAsException

           ReturnFalse'错误时扔出false信息

       Finally

           '判断数据库连接对象是否为断开状态,如果为连接则断开

           '判断数据库操作命令是否存在,若存在则销毁

           CloseCommand(comd)

           Call CloseConn()

       EndTry

   EndFunction

   '''<summary>

   '''查询操作,(有参数),返回一个查询的信息表

   '''</summary>

   '''<param name="strSql">执行语句,可能是单个sql语句,也可能是一个存储过程</param>

   '''<param name="cmdType">命令类型(存储过程, T-SQL语句, 等等</param>

   '''<param name="sqlParmars">参数数组,不确定参数个数</param>

   '''<returns>返回类型 一个datatable</returns>

   '''<remarks></remarks>

   PublicFunction ExecuteSelect(ByVal strSql AsString,ByVal cmdTypeAsCommandType,ByVal sqlParmarsAsSqlParameter())AsDataTable

       Dim sqlAdapterAsSqlDataAdapter'定义数据适配器

       Dim dtSQlAsNewDataTable'定义datatable表存储数据

       Dim dsSQLAsNewDataSet '定义dataset本地缓存数据

       'comd.Parameters.AddRange(sqlParmars) '传入参数

 

       '参数传递填充comd对象

       comd.CommandType = cmdType

       comd.CommandText = strSql

       comd.Connection = conn

       comd.Parameters.AddRange(sqlParmars)'添加参数

       sqlAdapter =NewSqlDataAdapter(comd)'实例化adapter

 

       Try

 

           sqlAdapter.Fill(dsSQL)'填充dataset

           dtSQl = dsSQL.Tables(0)'datatable为dataset的第一个表

           comd.Parameters.Clear()'清除参数

       Catch exAsException

           MsgBox("查询失败",CType(vbOKOnly +MsgBoxStyle.Exclamation,MsgBoxStyle))

       Finally

           CloseCommand(comd)'销毁命令

           Call CloseConn()'销毁语句

 

 

       EndTry

       Return dtSQl'返回查询结果

   EndFunction

   '''<summary>

   '''查询操作,(无参数),返回一个查询的信息表

   '''</summary>

   '''<param name="strSql">执行语句,可能为单条sql语句,也可能是一个存储过程</param>

   '''<param name="cmdType">命令类型(存储过程 ,T-SQL语句等)</param>

   '''<returns>返回datatable</returns>

   '''<remarks></remarks>

   PublicFunction ExecuteSelect(ByVal strSql AsString,ByVal cmdTypeAsCommandType)AsDataTable

       Dim dtSQLAsNewDataTable'定义查询表

       Dim dsSQLAsNewDataSet '定义数据缓存器

       Dim sqlAdapterAsSqlDataAdapter'定义数据适配器

 

       '参数传递填充comd对象

       comd.CommandType = cmdType

       comd =NewSqlCommand(strSql, conn)

       sqlAdapter =NewSqlDataAdapter(comd)'实例化数据适配器,读取数据

       Try

           sqlAdapter.Fill(dsSQL)'填充dataset缓冲池

           dtSQL = dsSQL.Tables(0)'datatable为dataset的第一个表

       Catch exAsException

       Finally

           CloseCommand(comd)'销毁命令

           Call CloseConn()'销毁语句

 

       EndTry

       Return dtSQL'返回值 ,datatable类型

   EndFunction

   '''<summary>

   '''查询操作,有参数,返回一个dataSet

   '''</summary>

   '''<param name="strSql">执行语句,可以是一个sql语句或一个存储过程</param>

   '''<param name="cmdType">命令类型(存储过程 ,T-SQL语句等)</param>

   '''<param name="sqlParamters">参数集,不知道有多少个参数</param>

   '''<returns>返回类型DataSet</returns>

   '''<remarks></remarks>

   PublicFunction ExecuteQuery(ByVal strSql AsString,ByVal cmdTypeAsCommandType,ByVal sqlParamtersAsSqlParameter())

       Dim dsSQLAsNewDataSet

       Dim sqlAdapaterAsSqlDataAdapter'定义数据适配器

       comd.Parameters.AddRange(sqlParamters)'传入参数

       comd.CommandType = cmdType'定义执行语句类型

       comd =NewSqlCommand(strSql, conn)'执行连接语句

       sqlAdapater =NewSqlDataAdapter(comd)'实例化数据适配器,进行读取数据

       Try

           sqlAdapater.Fill(dsSQL)'填充dataset数据缓冲池

           comd.Parameters.Clear()'清楚参数

           Return dsSQL

       Catch exAsException

           Throw ex

       Finally

           '关闭连接字符和命令

           CloseCommand(comd)

           Call CloseConn()

       EndTry

 

   EndFunction

   '''<summary>

   '''销毁数据库命令

   '''</summary>

   '''<remarks></remarks>

   PrivateSub CloseCommand(ByVal comd AsSqlCommand)

       '判断数据库操作命令是否存在,若存在则销毁

 

       comd.Dispose()'销毁命令

       comd =Nothing

 

   EndSub

 

   '''<summary>未用到此方法

   '''获取一个带参数产寻结果的读取器

   '''</summary>

   '''<param name="strSql">执行语句,可能为单条sql语句,也可能是一个存储过程</param>

   '''<param name="cmdType">命令类型(存储过程 ,T-SQL语句等)</param>

   '''<param name="sqlParamars">参数,不知道有多少个参数</param>

   '''<returns>返回一个个查询结果</returns>

   '''<remarks></remarks>

   PublicFunction ExecuteReader(ByVal strSql AsString,ByVal cmdTypeAsCommandType,ByVal sqlParamarsAsSqlParameter())AsSqlDataReader

       comd.CommandType = cmdType

       comd =NewSqlCommand(strSql, conn)'执行数据库命令和连接字符

       comd.Parameters.AddRange(sqlParamars)'添加参数

 

       Try

           conn.Open()'打开数据连接

           Return comd.ExecuteReader()

           comd.Parameters.Clear()'清楚参数

       Catch exAsException

           MsgBox("获取失败",MsgBoxStyle.Information)

       Finally

           'Call CloseConn()

           'Call CloseCommand() '销毁命令

       EndTry

       '返回一个读取结果

       Return comd.ExecuteReader(CommandBehavior.CloseConnection)

   EndFunction

   '''<summary>

   '''关闭连接字符

   '''</summary>

   '''<remarks></remarks>

   PrivateSub CloseConn()

       '判断数据库连接对象是否为断开状态,如果为连接则断开

       If conn.State <>ConnectionState.ClosedThen

           conn.Close()

       EndIf

   EndSub

EndClass