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
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
Imports Entity
Imports SqlHelper
Imports [Interface]
Imports System.Data.SqlClient
PublicClassSqlRechargeDAL
Implements [Interface].IRecharge
'''
'''增加充值信息方法
'''
'''参数实体类
'''参数实体类
'''
'''
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
'''
'''增加学生充值方法
'''
'''参数实体类
'''参数实体
'''
'''
Function AddCardRecharge(ByVal enRechargeAsRechargeEntity,ByVal enStudentAsStudentEntity)AsBoolean
End Interface
实体层 主要是获取数据库的字段 。这里就不再详细编写
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语句, 等等)
'''参数数组,无法确认有多少个参数
'''
'''
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语句, 等等
'''
'''
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语句, 等等
'''参数数组,不确定参数个数
'''
'''
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语句等)
'''
'''
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语句等)
'''参数集,不知道有多少个参数
'''
'''
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