如何开发一个学生成绩管理糸统(9)

  这一节,我要说明的是在数据集中添加事务,

在这里说明一下事务的必要性:

大多数基于 web 的电子邮件客户端都使用一个网格列出每条消息,除了包含邮件的信息(主题、发送者等等)外,还包括一个复选框。该界面允许用户删除多个消息,方法是先勾选上它们,再单击“Delete Selected Messages ”按钮。在用户通常编辑多条不同记录的情况下,一个批量编辑界面则是一项理想的选择。用不着让用户对每条要修改的记录,单击Edit ,进行修改,然后单击 Update ,批量编辑界面里每条记录都有其各自的编辑界面。用户可以快速地修改需要更改的那几行,然后单击“Update All” 按钮保存这些更改。在本系列教程中,我们将探讨如何创建插入、编辑和删除批量数据的界面。

执行批操作时,重要的是确定是否会出现批操作中的某些操作可能成功而其它操作可能失败的情况。考虑一个批量删除界面:如果选择的第一条记录删除成功,但第二条由于违反外健约束而失败时,会出现什么情况?第一条记录的删除操作应该回滚?还是可以接受删除第一条记录?

如果想把批操作作为原子操作 对待,即所有的操作步骤要么都成功要么都失败,则需要对数据访问层进行扩展以支持数据库事务 。数据库事务确保INSERT 、UPDATE 和 DELETE 语句集的原子数在事务的保护下执行,大多数当代数据库系统都支持数据库事务特性。

 

事务概述

大多数数据库都支持事务,它可以把多个数据库命令当成一个逻辑单元进行处理。保证组成事务的数据库命令是原子级表示所有的命令要么都失败要么都成功。

一般来说,事务通过 SQL 语句来实现,使用如下的模式:

  1. 指示事务的开始。
  2. 执行构成事务的 SQL 语句。
  3. 如果步骤 2 中的一个语句出错,则回退该事务。
  4. 如果步骤 2 中的所有语句都没有错误, 则提交该事务。

位于App_Code 文件夹的 DAL 子文件夹中。在 DAL 文件夹中创建一个名为 TransactionSupport 的子文件夹,并在里面添加一个名为s_courseinfoTableAdapter.TransactionSupport.cs 的新的类文件。该文件将保持s_courseinfoTableAdapter的部分实现,s_courseinfoTableAdapter 包含使用事务执行数据修改的方法。

在类中添加 如下代码

注意 这里使用的类是partical 部分类,将数据库事务操作封装在类的内部

ContractedBlock.gifExpandedBlockStart.gif代码
namespace GYsmsTableAdapters
{
/// <summary>
///s_courseinfoTableAdapter 的摘要说明
/// </summary>
partial class s_courseinfoTableAdapter
{

private SqlTransaction _transaction;
private SqlTransaction Transaction
{
get
{
return this._transaction;
}
set
{
this._transaction = value;
}
}
}

在加入 开始事务的方法

 

ContractedBlock.gifExpandedBlockStart.gif代码
public void BeginTransaction()
{
// Open the connection, if needed
if (this.Connection.State != ConnectionState.Open)
this.Connection.Open();

// Create the transaction and assign it to the Transaction property
this.Transaction = this.Connection.BeginTransaction();

// Attach the transaction to the Adapters
foreach (SqlCommand command in this.CommandCollection)
{
command.Transaction
= this.Transaction;
}

this.Adapter.InsertCommand.Transaction = this.Transaction;
this.Adapter.UpdateCommand.Transaction = this.Transaction;
this.Adapter.DeleteCommand.Transaction = this.Transaction;
}

 

 

再下来是提交,和回滚事务操作

 

ContractedBlock.gifExpandedBlockStart.gif代码
public void CommitTransaction()
{
// Commit the transaction
this.Transaction.Commit();

// Close the connection
this.Connection.Close();
}


public void RollbackTransaction()
{
// Rollback the transaction
this.Transaction.Rollback();

// Close the connection
this.Connection.Close();
}

 

 

 

在类中添加事务更新方法

 

ContractedBlock.gifExpandedBlockStart.gif代码
/// <summary>
/// 事务性更新
/// </summary>
/// <param name="dataTable"></param>
/// <returns></returns>
public int UpdateWithTransaction(GYsms.s_courseinfoDataTable dataTable)
{
this.BeginTransaction();

try
{
// Perform the update on the DataTable
int returnValue = this.Adapter.Update(dataTable);

// If we reach here, no errors, so commit the transaction
this.CommitTransaction();

return returnValue;
}
catch
{
// If we reach here, there was an error, so rollback the transaction
this.RollbackTransaction();

throw;
}
}

 

 

这样就完成了DAL层的事务添加了,

这样,在BLL层添加事务性的方法,事务性添加,事务性删除

 

 

ContractedBlock.gifExpandedBlockStart.gif代码
/// <summary>
/// 批量事务性更新
/// </summary>
/// <param name="products"></param>
/// <returns></returns>
public int UpdateWithTransaction(GYsms.s_courseDataTable Coursetable)
{
return Adapter.UpdateWithTransaction(Coursetable);
}
/// <summary>
/// 批量事务性删除
/// </summary>
/// <param name="productIDs"></param>
public void DeleteCourseWithTransaction
(System.Collections.Generic.List
<int> CourseIDs)
{
// Start the transaction
Adapter.BeginTransaction();

try
{
// Delete each product specified in the list
foreach (int CourseID in CourseIDs)
{
Adapter.Delete(CourseID);
}

// Commit the transaction
Adapter.CommitTransaction();
}
catch
{
// There was an error - rollback the transaction
Adapter.RollbackTransaction();

throw;
}
}

 

 

在WEB层的Course,aspx网页上有一个批量删除的方法,这样写就行

 

ContractedBlock.gifExpandedBlockStart.gif代码
protected void DelSel_Click(object sender, EventArgs e)
{
List
<int> delnums = new List<int>();
foreach (RepeaterItem Item in Repeater1.Items)
{
CheckBox ck
= (CheckBox)Item.FindControl("ckbIndex");
Label lab
= (Label)Item.FindControl("Labelid");

if (ck.Checked)
{
int j = Convert.ToInt32(lab.Text);
delnums.Add(j);
}
}
CourseAPI.DeleteCourseWithTransaction(delnums);
AlertMessage.Redirect(
this, "删除成功", "Course.aspx");

}

 

 

我在帖上在Repeater里面的代码

 

 

 

ContractedBlock.gifExpandedBlockStart.gif代码
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<tr><td class="chk"><asp:CheckBox runat="server" ID="ckbIndex" /></td>
<td><asp:Label ID="Labelid" runat="server" Text='<%#Eval("id") %>'></asp:Label></td>
<td><asp:Label ID="Labelkid" runat="server" Text='<%#Eval("kid") %>'></asp:Label></td>
<td><asp:Label ID="Labelkname" runat="server" Text='<%#Eval("kname") %>'></asp:Label></td>
<td><asp:Label ID="Labelteacher" runat="server" Text='<%#Eval("teacher") %>'></asp:Label></td>
<td><asp:Label ID="Labelterm" runat="server" Text='<%#Eval("term") %>'></asp:Label></td>


<td><div><span><img src="images/edt.gif" alt="编辑" width="16" height="16" /><a href="Course_edit.aspx?action=edit&id=<%# Eval("id") %>" title="">编辑</a>
&nbsp; &nbsp;<img src="images/del2.gif" alt="删除" width="16" height="16" /><a href="course.aspx?action=del&id=<%# Eval("id") %>" title="" onclick="return confirm('真的要删除吗?');" >删除</a></span></div>
</ItemTemplate>

</asp:Repeater>

 

 

这样就完成数据集事务的说明了,下一节,我会写上Courseadd.aspx的页面,批量添加课程信息.

 

转载于:https://www.cnblogs.com/ScriptZhang/archive/2010/05/20/1739791.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

见识决定眼界,关注这些让你变得博学且有趣

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给你带…

ELK太重?试试KFC日志采集

写在前面ELK三剑客&#xff08;ElasticSearch&#xff0c;Logstash&#xff0c;Kibana&#xff09;基本上可以满足日志采集、信息处理、统计分析、可视化报表等一些日志分析的工作&#xff0c;但是对我们来说……太重了&#xff0c;并且技术栈不是一路的。我们的场景是需要采集…

linux引导时输入特殊信息的含义

linux引导时输入特殊信息的含义&#xff1a;通常只有在缺省模式失败&#xff08;屏幕一片混乱或者安装到某个阶段无法进行下去&#xff09;的情况下会尝试这些模式。 对于一些支持的其他模式&#xff0c;参考文件/usr/share/doc/anaconda*/command-line.txt&#xff08;如果安装…

ActionContext和ActionSupport的学习

2019独角兽企业重金招聘Python工程师标准>>> ActionContext和ActionSupport的学习 1.ActionContext中有众多的定义好的常量&#xff0c;就像是Constant类中定义的常量&#xff1b;诸如&#xff1a;session、Application、actionInvocation、Container等&#xff1b;…

中求和符号上下标_涨电脑知识:如何在word中编写复杂的公式,写论文必备技能...

我们在用word写资料时&#xff0c;比如论文、数据分析、报告等&#xff0c;经常需要插入一些公式&#xff0c;这些公式会含有一些特殊符号&#xff0c;比如根号、分式、求和等&#xff0c;这些特殊符号是不能直接用输入法来完成的&#xff0c;需要借助于word扩展的功能来帮助我…

菲尔兹奖第一华人!从抓虾仔到哈佛终身教授,他年少成名,获奖无数,造福我国数学教育数十年...

全世界只有3.14 % 的人关注了爆炸吧知识在数学界有这么一个人&#xff0c;他有着“数学天才”、“科学大师”、数学王国的“凯撒大帝”等一众称号。就连国际数学大师、阿贝尔奖获得者辛格都这样评价他说&#xff1a;“即使在哈佛&#xff0c;他一个人就是一个数学系&#xff01…

为什么我们总是忍不住要刷微信?

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给你带…

22、多进程和多线程

 Android进程简介 Android会启动一个LINUX进程和一个主线程。默认的情况下,所 有该程序的组件都将在该进程中运行。当启动应用程序时,Linux会为每 一个程序单独分配一个进程,该进程默认只拥有一个主线程。 组件可以运行在当前进程中,也可以运行在其他进程中。组件运行在 哪个…

Docker小白到实战之常用命令演示,通俗易懂

前言上一篇大概认识了Docker&#xff0c;主要是从概念、架构、优点及流程方面进行阐述&#xff0c;并进行安装和体验&#xff1b;接下来就开始进行实操学习&#xff0c;在演示过程中会针对关键的知识点进行归纳和总结&#xff0c;这里先从常用命令说起&#xff0c;来吧&#xf…

今天这个日子,大多数人都不知道…

全世界只有3.14 % 的人关注了爆炸吧知识我是蝙蝠&#xff0c;身体虽小五毒俱全你确定要尝吗&#xff1f;我是果子狸&#xff0c;人们一度“谈我色变”但如今又被端上餐桌&#xff01;我是野兔&#xff0c;人们说我很可爱我的肉却变成“野味”毛发变成皮草……今天&#xff0c;世…

Python办公自动化Day2-openpyxl

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;常规操作添加数据遍历所有单元格数据合并/取消合并单元格添加/删除行与列移动指定范围单元格 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 Python办公自动化自学笔记知识…

传递函数_使用python计算麦克风阵列信号的传递函数

使用python写了一个测试麦克风阵列传递函数的demo&#xff0c;有需要的自取。该代码使用了第三方库ThinkDSP。1. 传递函数首先解释下什么是传递函数&#xff1a;把具有线性特性的对象的输入与输出间的关系&#xff0c;用一个函数(输出波形的拉普拉斯变换与输入波形的拉普拉斯变…

中国数学竞赛史上最玩命的“赌徒”,为了国家荣誉,他不惜用生命换来了五次世界第一...

全世界只有3.14 % 的人关注了爆炸吧知识知识君今天&#xff0c;要跟大家介绍的是&#xff0c;北大历史上首位被授予博士学位的人&#xff0c;深受癌症折磨的同时还带领着中国学子连续5次站上世界顶端的人&#xff0c;他的故事&#xff0c;他的品格&#xff0c;值得被所有人记住…

javq接口_Java为什么要使用接口_java接口怎么使用

Java接口是什么Java接口是一系列方法的声明&#xff0c;是一些方法特征的集合&#xff0c;一个接口只有方法的特征没有方法的实现&#xff0c;因此这些方法可以在不同的地方被不同的类实现&#xff0c;而这些实现可以具有不同的行为(功能)。接口(英语&#xff1a;Interface)&am…

[(转)hystar整理]Entity Framework 教程

预备知识 2 LINQ技术 2 LINQ技术的基础 - C#3.0 2 自动属性 2 隐式类型 2 对象初始化器与集合初始化器 3 匿名类 3 扩展方法 4 Lambda表达式 4 .NET中的数据访问 4 DataSet方案 5 改进的的DataSet方案 5 手写代码通过ADO.NET2…

13岁上中科大,17岁攻读哈佛博士,“天才”尹希的开挂人生

全世界只有3.14 % 的人关注了爆炸吧知识2013年美国斯隆基金会(Alfred P. Sloan Foundation)颁发的美国斯隆研究奖获得者尹希&#xff0c;31岁哈佛最年轻的华人教授&#xff0c;获2017年“豪华版诺贝尔奖”之称的科学突破奖-物理学新视野奖&#xff0c;这年唯一的获奖华裔。知识…

强制升级?!.NET Core 2.1容器镜像将从Docker Hub中删除

前言.NET Core 2.1将于2021年8月21日结束支持&#xff0c;本来应该没什么影响&#xff0c;该怎么用继续用得了。但是&#xff0c;如果你在生产环境使用了.NET Core 2.1容器镜像&#xff0c;那就要注意了&#xff0c;从8月21日开始&#xff0c;.NET Core 2.1容器镜像将不再在Doc…

“史上“最疯狂”的顶级数学家,看完后忍不住感慨太神了”

▲ 点击查看说起世界上最顶级的数学家&#xff0c;你的脑海中会浮现的&#xff0c;大概是欧拉、高斯、香农等数学巨匠。但是要说起成就和神秘性兼备的&#xff0c;一定就是——称为印度之子的——拉马努金。1887年12月22日&#xff0c;拉马努金出生在印度一个穷困潦倒的家庭&am…

致家长:疫情期间教育好自己的孩子,就是你最重要的事业!

全世界只有3.14 % 的人关注了爆炸吧知识疫情危机&#xff0c;却也是教育的契机。现在孩子呆在家里&#xff0c;老师管不了孩子&#xff0c;却也正是家长重新认识父母之责的契机。家长才是孩子的第一任老师&#xff0c;家长的言传身教、一举一动都影响着孩子成长。孩子是你的唯一…

设计模式之访问者

访问者模式介绍访问者模式能将算法与其所作用的对象隔离开来。访问者模式建议将新行为放入要给名为访问者的独立类中&#xff0c;而不是试图将其整合到已有类中。它允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。需要执行操作的原始对象将作为参数被传递给访…