实验7: 事务处理
一、实验名称和性质
所属课程 | C#数据库系统设计 |
实验名称 | 事务处理 |
实验学时 | 2 |
实验性质 | ✓□验证 □综合 ✓□设计 |
必做/选做 | ✓□必做 □选做 |
二、实验目的
1. 掌握事务的特点。
2. SQL SERVER中处理事务的方法。
3. C#中处理事务的机制。
三、实验的软硬件环境要求
硬件环境要求:
PC机(单机)
使用的软件名称、版本号以及模块:
Windows XP下的SQL Server 2005(或 SQL Server 2008)
四、知识准备
SqlTransaction类
初始化SqlTransaction类时,你需要使用SqlConnection类的BeginTranscation()方法:
SqlTransaction myTran; myTran=myConn.BeginTransaction();
v SqlTransaction的主要方法
Commit(),提交事务
Rollback(),回滚事务
Save(),在事务中创建保存点(它可用于回滚事务的一部分),并指定保存点名称。
五、实验内容
1. 建立数据库trDemo。(验证性试验)
CREATE TABLE bOneUser(
userID varchar(20) NOT NULL,
balance money NULL))
insert into bOneUser values(‘Kevin’,1000)
insert into bOneUser values(‘zxx’,500)
(2)建立窗体项目,窗体中建立控件及属性如下表。
控件 | 属性名 | 属性值 |
文本框1 | Name | txtFromUser |
文本框2 | Name | txtToUser |
文本框3 | Name | txtTransferMoney |
命令按钮1 | Name | btnTransfer |
Text | 转账 |
单击“转账”按钮,将钱从txtFromUser账户中转相应金额到txtToUser输入的账户中。
(3)编写btnTransfer-Click()事件代码
Sub void btnTransfer-Click()
{
string strConn = @"server=.\sqlexpress;database=trDemo;integrated security=true";
SqlConnectionconn = new SqlConnection(strConn);
conn.Open();
SqlTransactiontr = conn.BeginTransaction();
stringstrUpdate1 = "update bOneUser set balance=balance-@balance where userId=@userID";
SqlCommandcmd = new SqlCommand(strUpdate1, conn);
cmd.Transaction = tr;
cmd.Parameters.AddWithValue ("@UserID", txtFromUser.Text);
cmd.Parameters.AddWithValue ("@balance", int.Parse(txtTransferMoney.Text));
stringstrUpdate2 = "update bOneUser set balance=balance+@balance where userId=@userID";
SqlCommandcmd2 = new SqlCommand(strUpdate2, conn);
cmd2.Transaction = tr;
cmd2.Parameters.AddWithValue ("@UserID", txtToUser.Text);
cmd2.Parameters.AddWithValue ("@balance", int.Parse(txtTransferMoney.Text));
int i,j;
try
{
j=cmd.ExecuteNonQuery();
i=cmd2.ExecuteNonQuery();
if (i==1 && j==1)
{
tr.Commit(); MessageBox.Show("transfered");}
else
{ tr.Rollback();MessageBox.Show("transfer is failed"); }
}
catch(SqlException ex)
{
tr.Rollback();
MessageBox.Show("transfer is failed");
}
}
输入正确:从Kevin转200到zxx.
输入错误的:从zxx转400到Daisy.
写出数据库中的数据情况。
如果从Kevin转2000到zxx程序执行情况是什么?符合银行转账要求吗?
2.建立数据表。
CREATE TABLE bTwoUser(
userID varchar(20) NOT NULL,
balance money NULL))
insert into bTwoUser values(‘Liuxiang’,1000)
insert into bTwoUser values(‘Daisy’,500)
编写与1同样的界面。转账时从bOneUser中的txtFromUser账户中转输入的金额到bTwoUser 表中的txtToUser账户中。
测试:(1)从bOneUser的Kevin帐号转200到bTwoUser的Daisy帐号中。
(2)从bOneUser的zxx帐号转400到bTwoUser的Kevin帐号中。
3. 在C表中增加selectedNum字段,用来记录选修该课程的选修学生人数。在界面上删除SC表中一条记录时,要C表中将该课程的selectedNum减去1.(由于在SC表中删除记录和在C表中修改该课程的selectedNum要么都执行,要么回滚。用事务处理来完成。)
Sql server中在student数据库中执行下面T-SQL代码。
alter table c add selectedNum int
update C set selectedNum=(select COUNT(sno) from SC where Cno=c.cno)