事务实例

 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

'''

'''充值窗体

'''

'''

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

   '''

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

   '''

   '''

   '''

   '''

   '''

   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

   '''

   '''增加充值信息方法

   '''

   '''参数实体类

   '''参数实体类

   '''返回类型Boolean

   '''

   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

   '''

   '''增加学生充值方法

   '''

   '''参数实体类

   '''参数实体

   '''返回值Boolean类型

   '''

   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

 

   '''

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

   '''

   '''需要执行的语句,一般是Sql语句,也有存储过程

   '''命令类型(存储过程, T-SQL语句, 等等)

   '''参数数组,无法确认有多少个参数

   '''返回布尔类型,成功为true,否则为false

   '''

   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

   '''

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

   '''

   '''需要执行的语句,可能是一般语句,也可能是存储过程

   '''命令类型(存储过程, T-SQL语句, 等等

   '''返回布尔类型,成功为true,否则为false

   '''

   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

   '''

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

   '''

   '''执行语句,可能是单个sql语句,也可能是一个存储过程

   '''命令类型(存储过程, T-SQL语句, 等等

   '''参数数组,不确定参数个数

   '''返回类型 一个datatable

   '''

   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

   '''

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

   '''

   '''执行语句,可能为单条sql语句,也可能是一个存储过程

   '''命令类型(存储过程 ,T-SQL语句等)

   '''返回datatable

   '''

   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

   '''

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

   '''

   '''执行语句,可以是一个sql语句或一个存储过程

   '''命令类型(存储过程 ,T-SQL语句等)

   '''参数集,不知道有多少个参数

   '''返回类型DataSet

   '''

   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

   '''

   '''销毁数据库命令

   '''

   '''

   PrivateSub CloseCommand(ByVal comd AsSqlCommand)

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

 

       comd.Dispose()'销毁命令

       comd =Nothing

 

   EndSub

 

   '''

未用到此方法

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

   '''

   '''执行语句,可能为单条sql语句,也可能是一个存储过程

   '''命令类型(存储过程 ,T-SQL语句等)

   '''参数,不知道有多少个参数

   '''返回一个个查询结果

   '''

   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

   '''

   '''关闭连接字符

   '''

   '''

   PrivateSub CloseConn()

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

       If conn.State <>ConnectionState.ClosedThen

           conn.Close()

       EndIf

   EndSub

EndClass

你可能感兴趣的:(【.NET】,【数据库】)