c的事务处理三层架构-jacky7博客园_第1页
c的事务处理三层架构-jacky7博客园_第2页
c的事务处理三层架构-jacky7博客园_第3页
c的事务处理三层架构-jacky7博客园_第4页
c的事务处理三层架构-jacky7博客园_第5页
免费预览已结束,剩余9页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#的事务处理(三层架构)-jacky73 -博客园C#的事务处理(三层架构)有一天gemfield 去银行给capucivar的账户上转 500元,他 开始进行操作,相应的sql语句是这样的:”updatezhuanzhang set money=money-500 where username=’gemfield’”,止匕时系统正常运行,执行了该 sql语句之后,gemfield账户上的现金少 了 500 元,然后执行 sql 语句 ”update zhanzhang set money=m

2、oney+500 where username=’capucivar’”,让capucivar账户上的现金增加 500元。但是有时候 “ 天不遂人愿”,当gemfield账户上的现金减少了 500 元之后,还没来得及给 capucivar的账户上添加500元数据 库突然就断电了。这样的话,gemfield账户上的现金少了 500 元,但是capucivar账户上的现金却没有多由500元来。这可怎么办,总不能让这 500元就凭空消失吧。所以就引生了 “事务处理 &#82

3、21;。什么是事务处理?可以这样说,每一条语句都独立构成一个事务。在上面 的事例中,我们希望两个语句在都执行并没有发生异常之后, 再提交结果。那么就将这两个语句组成一个事务。接下来要将上面的例子用事务处理的方法做由来,如何 写呢?需要注意的是 capucivar以前写的Db.cs类即数据处 理类,此处与以前所写的不同。下面就来写这个数据处理的 类 Db.cs :using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.OleDb;using System

4、.Collections;namespace Db/ 命名空间public class DbConnOleDbConnection conn = null;/声明连接数据库对象public DbConn() 构造方法if (conn = null)conn = new OleDbConnection();/ 实例化对象conn.ConnectionString ="provider=sqloledb.1;data source=.;initial catalog=capucivar;user id=sa;pwd="/连接数据库if (conn.State = Connect

5、ionState.Closed) conn.Open();/ 打开连接 public DataTable QuerySql(string sql) DataTable dt = new DataTable();/实例化一个DataTable对象OleDbDataAdapter da = newOleDbDataAdapter(sql, conn);/实例化一个适配器对象da.Fill(dt);/ 将数据填充到 DataTable 中 conn_close();/ 调用 conn_close()方法关闭连接return dt;/返回结果集 public int Update(ArrayList

6、al)OleDbTransaction tran =null;/OleDbTransaction表示要在数据源执行的SQL事物tran =conn.BeginTransaction();BeginTransaction()表示开始数据库事务OleDbCommand oc = newOleDbCommand();/OleDbCommand类表示要对数据源执行的SQL语句或存储过程。oc.Connection = conn;/ 指定数据库连接 oc.Transaction = tran;/ 指定开始的事务 int x = -1;try(foreach (string sql in al)/ 用 f

7、oreach 遍历 ArrayList , ArrayList里的每一个元素都是 string类型的sql 语句(oc.CommandText = sql;/ 设置要对数据源执行的SQL命令文本x = oc.ExecuteNonQuery();/ 执行SQL并返回所受影响行数if(x<=0)/ 如果x<=0就说明该Sql语句没有成功执行,那么就让它回滚, 回滚至没有更新数据之前 tran.Rollback();/ 让事物回滚tran.Commit(); 提交事物catch/如果发生异常了,就将事务回滚x = -1;tran.Rollback();/ 让事物回滚con

8、n_close();/ 调用 conn_close() 方法关闭数据库连接return x;/返回受影响的行数用以判断操作是否成功public void conn_close()if (conn.State = ConnectionState.Open)conn.Close();/ 关闭连接) 上面的类写好了,下面来做图形用户界面:在写图形用户界面之前,要提到 “C#的三层模式 ”:三层模式:1、UI:显示层也就是图形用户界面 (use门nterface),它 是一个windows窗体应用程序2、BLL:业务逻辑层(business logic laye

9、r)。它是一个类 库,在该层里经常是些 sql语句的和封装字段的。封装字段 的代码经常写在一个 VO文件夹下 VO是value object的所 写。3、DAL:数据访问层(data access layer)。同样是类库。 该层就是连接数据库,和执行sql语句的。使用三层模式要注意:这三层是毫无联系的三个项目,如何 让它们联系起来?首先重新生成DAL层-à将DAL层添加引用到 BLL层-àBLL 层重新生成-à将BLL 层添加引用到UI层,这样就会将三个毫无联系的三个项目 通过添加引用联系起来。三层模式也就这些了 , 下面该来写上面例子的

10、BLL层了 ,BLL层下有一个文件夹叫VO ,在该文件夹下写一个类:using System;using System.Collections.Generic;using System.Text;namespace Bll.VO/ 命名空间public class Person下面是将字段封装通过get和set来取值或赋值private string yourname = string.Empty;/ 自己的名 字public string Yournameget return yourname; set yourname = value; private string yourhao = s

11、tring.Empty/ 自己的帐 号;public string Yourhaoget return yourhao; set yourhao = value; )private string hishao = string.Empty;/ 对方的帐号 public string Hishao(get return hishao; set hishao = value; private int money = -1;/ 个用户 的现金public int Moneyget return money; set money = value; 封装成一个类之后,来写业务逻辑层:using Syst

12、em;using System.Collections.Generic;using System.Text;using System.Collections;using System.Data;namespace Bll/ 命名空间public bool exeSql(VO.Person ps)(string sqll = string.Format("updatezhuanzhang set money=money-0 wherezhanghao='1'",ps.Money,ps.Yourhao);string sql2 = string.Format(&

13、quot;updatezhuanzhang set money=money+0 where zhanghao='1'", ps.Money, ps.Hishao);/ 拼写 Sql 语句ArrayList al = new ArrayList();/ArrayList 对象 alal.Add(sql1);al.Add(sql2) 为 ArrayList 添加值;int x = new Db.DbConn().Update(al);/ 执行Db.DbConn().Update()放法之后将返回的受影响行数赋给xif (x > 0)/判断x,如果x大于0那么

14、就执行 成功,返回true ,否则的话返回false return true;return false;下面是查询所有信息,将信息显示由来,以方便观察执行是否成功public DataTable select()(string sql = "selectusername,zhanghao,money from zhuanzhang"/ 拼写 sql 语句return new Db.DbConn().QuerySql(sql);/ 返回 查询结果最后就剩下UI层了:using System;using System.Collections.Generic;using Syst

15、em.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace zhuanzhang(public partial class Form1 : Formpublic Form1()(InitializeComponent();)下面是点击按钮后发生private void submit_but_Click(object sender,EventArgs e)(首先分别得到文本框里的值string yName = name_text.Te

16、xt;string yNum = zhanghao_text.Text;string hNum = hishao_text.Text;int money =Convert.ToInt32(money_text.Text);将上面的字段通过Bll.VO.Person进行封装Bll.VO.Person ps = new Bll.VO.Person();ps.Yourname = yName;ps.Yourhao = yNum;ps.Hishao = hNum;ps.Money = money;bool b = new Bll.Sql().exeSql(ps);通过返回值判断转账是否成功if (b)

17、(MessageBox.Show("转账成功!”);)else(MessageBox.Show("转账失败!”);)refurbish();/调用refurbish()方法将下面表格中的数据从数据库中重新查找一次再显示由来)private void Form1_Load(object sender,EventArgs e)(refurbish();)public void refurbish()(DataTable 出=new Bll.Sql().select();/ 得到结果集this.dataGridView1.DataSource = dt;/ 将dataGridViewl 的数据源指定为 dt)事务处理使用“三层模式”写完了,可以来 看看结果:先输入一个错误的对方帐号,显示“转账失败”,点击“确定”之后,可以看到数据库 中的数据并没有改变。输入正确的:它显示“转账成功”的对话框, 点击“确定&#8221

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论