读书人

事宜实例

发布时间: 2013-03-12 11:19:35 作者: rapoo

事务实例

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 0endgo else   --如何两条都执行成功commit tran 执行这个事务的操作return 1endgo


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

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

存储过程中事物代码如下

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)ASBEGIN   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 strSqlAsString,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 strSqlAsString,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 strSqlAsString,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 strSqlAsString,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 strSqlAsString,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 strSqlAsString,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

读书人网 >软件架构设计

热点推荐