一:

二:SalarySheetDAL.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using HRMSys.Model;
using System.Data; namespace HRMSys.DAL
{
public class SalarySheetDAL
{ /// <summary>
/// 判断是否是否生成指定年月和部门的工资单
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <param name="deptId"></param>
/// <returns></returns>
public bool IsExists(int year, int month, Guid deptId)
{
object obj= sqlhelper.ExecuteSca(@"select count(*) from T_SalarySheet where Year=@Year and Month=@Month and DepartmentId=@DepartmentId",
new SqlParameter("@Year",year)
,new SqlParameter("@Month",month)
,new SqlParameter("@DepartmentId",deptId));
return Convert.ToInt32(obj) > ;//将大于0的bool结果返回
}
/// <summary>
/// 清理生成的账套和该账套下的员工工资
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <param name="deptId"></param>
public void Clear(int year, int month, Guid deptId)
{
object obj = sqlhelper.ExecuteSca(@"select Id from T_SalarySheet where Year=@Year and Month=@Month and DepartmentId=@DepartmentId",
new SqlParameter("@Year",year)
,new SqlParameter("@Month",month)
, new SqlParameter("@DepartmentId", deptId));
Guid sheetId = (Guid)obj;
sqlhelper.ExecuteNon("delete from T_SalarySheetItem where SheetId=@SheetId",
new SqlParameter("@SheetId",sheetId));
sqlhelper.ExecuteNon("delete from T_SalarySheetItem where Id=@Id",
new SqlParameter("@Id",sheetId));
} /// <summary>
/// 建立账套,和该账套下的员工工资
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <param name="deptId"></param>
public Guid Build(int year, int month, Guid deptId)
{
//插入一条账套信息
Guid sheetId = Guid.NewGuid();
sqlhelper.ExecuteNon(@"insert into T_SalarySheet(Id,Year,Month,DepartmentId) values(@Id,@Year,@Month,@DepartmentId)",
new SqlParameter("@Id",sheetId) ,new SqlParameter("@Year",year),
new SqlParameter("@Month", month), new SqlParameter("@DepartmentId", deptId)); //查询符合该账套的所有员工
Employee[] employees = new EmployeeDAL().ListByDepment(deptId); //账套下的所有员工生成对应的员工工资
foreach (Employee employee in employees)
{
sqlhelper.ExecuteNon(@"insert into T_SalarySheetItem(Id,SheetId,EmployeeId,Bonus,BaseSalary,Fine,Other)
values (newid(),@SheetId,@EmployeeId,500,3000,0,0)",
new SqlParameter("@SheetId",sheetId),
new SqlParameter("@EmployeeId", employee.Id));
}
return sheetId; }
/// <summary>
/// 将数据库的表的行转换为SalarySheetItem的字段格式
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public SalarySheetItem ToSalaryItemModel(DataRow row)
{
SalarySheetItem item = new SalarySheetItem();
item.Id =(Guid) row["Id"];
item.BaseSalary = (decimal)row["BaseSalary"];
item.Bonus=(decimal)row["Bonus"];
item.EmployeeId=(Guid)row["EmployeeId"];
item.Fine=(decimal)row["Fine"];
item.Other=(decimal)row["Other"];
return item; }
/// <summary>
/// 将数据库的表的行转换为SalarySheetItemList的字段格式
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public SalarySheetItemList ToSalaryItemListModel(DataRow row)
{
SalarySheetItemList item = new SalarySheetItemList();
item.Id = (Guid)row["Id"];
item.BaseSalary = (decimal)row["BaseSalary"];
item.Bonus = (decimal)row["Bonus"];
item.EmployeeName = (string)sqlhelper.ExecuteSca("select Name from T_Employee where Id=@Id",
new SqlParameter("@Id", row["EmployeeId"]));
item.Fine = (decimal)row["Fine"];
item.Other = (decimal)row["Other"];
return item; }
/// <summary>
/// 将SalarySheetItem中的guid格式转换为对应的中文名字
/// </summary>
/// <param name="items"></param>
/// <returns></returns>
public SalarySheetItemList ToModelList(SalarySheetItem items)
{
SalarySheetItemList list = new SalarySheetItemList();
list.Id = items.Id;
list.SheetId = items.SheetId;
list.EmployeeName = (string)sqlhelper.ExecuteSca("select Name from T_Employee where Id=@Id",
new SqlParameter("@Id", items.EmployeeId));
list.BaseSalary = items.BaseSalary;
list.Bonus = items.Bonus;
list.Fine = items.Fine;
list.Other = items.Other; return list;
}
/// <summary>
/// 得到该账套下的所有员工的工资的信息
/// </summary>
/// <param name="sheetid"></param>
/// <returns></returns>
public SalarySheetItemList[] GetSalaryItems(Guid sheetid)
{ DataTable table=sqlhelper.datatable("select * from T_SalarySheetItem where SheetId=@SheetId"
,new SqlParameter("@SheetId",sheetid));
SalarySheetItemList[] items = new SalarySheetItemList[table.Rows.Count];
for (int i = ; i < table.Rows.Count; i++)
{ //将数据库的表的行转换为SalarySheetItemList的字段格式
items[i] = ToSalaryItemListModel(table.Rows[i]); }
return items; }
/// <summary>
/// 更新指定员工的工资信息
/// </summary>
public void UpdateSalaryList(SalarySheetItemList list)
{ sqlhelper.ExecuteNon(@"Update T_SalarySheetItem set BaseSalary=@BaseSalary,Bonus=@Bonus,
Fine=@Fine,Other=@Other where Id=@Id"
, new SqlParameter("@BaseSalary",list. BaseSalary)
, new SqlParameter("@Bonus", list.Bonus)
, new SqlParameter("@Fine", list.Fine)
, new SqlParameter("@Other", list.Other)
, new SqlParameter("@Id", list.Id));
} }
}

三:SalarySheet.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace HRMSys.Model
{
public class SalarySheet
{
public Guid Id { get; set; }
public int Year { get; set; }
public int Month { get; set; }
public Guid DepartmentId { get; set; }
}
}

四:SalarySheetItem.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace HRMSys.Model
{
public class SalarySheetItem
{
public Guid Id { get; set; }
public Guid SheetId { get; set; }
public Guid EmployeeId { get; set; }
public decimal Bonus { get; set; }
public decimal BaseSalary { get; set; }
public decimal Fine { get; set; }
public decimal Other { get; set; }
}
}

五:SalarySheetItemLIst.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace HRMSys.Model
{
public class SalarySheetItemList
{
public Guid Id { get; set; }
public Guid SheetId { get; set; }
public string EmployeeName { get; set; }
public decimal Bonus { get; set; }
public decimal BaseSalary { get; set; }
public decimal Fine { get; set; }
public decimal Other { get; set; }
}
}

六:BuildSalarySheet.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HRMSys.DAL;
using HRMSys.Model;
using System.Transactions; namespace HYMSys.UI.EmployeeMgr
{
public partial class BuildSalarySheet : Form
{
public BuildSalarySheet()
{
InitializeComponent();
}
/// <summary>
/// 自动载入事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BuildSalarySheet_Load(object sender, EventArgs e)
{
//声明一个存放年份的泛型变量
List<int> listYears = new List<int>();
for (int i = DateTime.Today.Year - ; i <= DateTime.Today.Year + ; i++)
{
listYears.Add(i);
} //声明一个存放月份的泛型变量
List<int> months = new List<int>();
for (int i = ; i <= ; i++)
{
months.Add(i);
}
//绑定数据源
cb_year.DataSource = listYears;
cb_month.DataSource = months;
cb_department.DataSource = new DepartmentDAL().GetAllDepartName(); }
/// <summary>
/// 生成工资表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_createSalary_Click(object sender, EventArgs e)
{
int year =(int ) cb_year.SelectedValue;
int month = (int)cb_month.SelectedValue;
Guid departId = new DepartmentDAL().getIdByName((string)cb_department.SelectedValue);
SalarySheetDAL dal = new SalarySheetDAL();
using (TransactionScope ts = new TransactionScope())//使用事务
{ if (dal.IsExists(year, month, departId) == true)
{
if (MessageBox.Show("工资单已经生成,是否重新生成?", "警告!", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
dal.Clear(year, month, departId);
MessageBox.Show("工资单已删除!");
}
} Guid sheet = dal.Build(year, month, departId);
dgv_Salary.DataSource = dal.GetSalaryItems(sheet);
ts.Complete();
}
MessageBox.Show("重新生成工资单了!"); }
/// <summary>
/// 单元格编辑完后事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgv_Salary_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
SalarySheetItemList list = new SalarySheetItemList();
list.Bonus =(decimal) dgv_Salary.CurrentRow.Cells[].Value;
list.BaseSalary = (decimal)dgv_Salary.CurrentRow.Cells[].Value;
list.Fine = (decimal)dgv_Salary.CurrentRow.Cells[].Value;
list.Other = (decimal)dgv_Salary.CurrentRow.Cells[].Value;
list.Id = (Guid)dgv_Salary.CurrentRow.Cells[].Value;
SalarySheetDAL dal = new SalarySheetDAL();
dal.UpdateSalaryList(list);
MessageBox.Show("更新成功!"); } }
}

七:事务服务启动、添加引用和使用事项

a.

b.

c.

事物应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性.
原子性(atomicity): 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency): 事物必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation): 一个事物的执行不能被其他事务干扰。即一个事物内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability): 持续性也称永久性(permanence),指一个事物一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

d.

工资表的生成、显示、修改工资,应用transactionscope 分布式事务的更多相关文章

  1. 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)

    本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...

  2. 25.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(1)

    查看Odoo产品分析系列--目录 工资表不在"应用"中,在搜索该模块时需要将默认的"应用"过滤删除掉.  安装工资表后,出现工资单菜单:  1. 薪资规则类别 ...

  3. 26.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(2)

    查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (三) – 人力资源板块(6) – 工资表(1) 4. 缴纳登记册 在"缴纳登记册"菜单中可以查看所有的登记册并新建:  ...

  4. WPF根据Oracle数据库的表,生成CS文件小工具

    开发小工具的原因: 1.我们公司的开发是客户端用C#,服务端用Java,前后台在通讯交互的时候,会用到Oracle数据库的字段,因为服务器端有公司总经理开发的一个根据Oracle数据库的表生成的cla ...

  5. dedecms5.7二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法

    dedecms5.7(织梦CMS5.7)二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法 dedecms升级到5.7SP1后,开启二级域名,你会发现,在二级域名下的文章,上传的图片地址都是: ...

  6. 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能

    在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...

  7. ArcGIS学习记录—属性表的编辑与修改

    原文地址: ArcGIS问题:属性表的编辑与修改 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.com/blog/static/344933882009 ...

  8. 《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

    原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与Page ...

  9. sqlserver数据库导出表结构和表数据生成创建表和insert语句

    问题描述: 有时候我们只需要导出一张表和表数据到另外一个数据库,如果是备份整个库的话,就会很麻烦那样,没法满足需求. 解决方法: 以sqlserver2014为例:把MGActivity数据库的bat ...

随机推荐

  1. log4j中Spring控制台输出Debug级信息过多解决方法

    log4j中Spring控制台输出Debug级信息过多解决方法 >>>>>>>>>>>>>>>>> ...

  2. Python之路【第十篇】:HTML -暂无等待更新

    Python之路[第十篇]:HTML -暂无等待更新

  3. 9.29noip模拟试题

    环上的游戏(cycle) 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这 ...

  4. Castle Windsor Fluent Registration API

    一对一注册 直接注册组件 container.Register( Component.For<MyServiceImpl>() ); 注册接口并提供组件 container.Registe ...

  5. 设计模式学习——准备(UML类图)

    前言 其实吧,最早接触UML是源于软件设计师的考试,半路出家实在难为我了.学设计模式总是要画类图的,所以补充UML的类图的知识是很重要滴.第一篇就偷懒一点copy别人的东西了.实话说,我们都是踩在巨人 ...

  6. [中级] 有效删除URL中的index.php

    如果你刚接触CI不久又或者刚刚研读CI的使用手册的话,关于如何有效删除URL中index.php以使URL看起来更友好美观的问题,可能是你面对的第一个较为复杂的问题!本贴不是原创,而是一个各种意见的综 ...

  7. 平衡搜索树(二) Rb 红黑树

    Rb树简介 红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black.通过对任何一条从根到叶子简单 路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍, ...

  8. mysql锁死的现象判断

    一般发生表锁死这种低级问题,就有两种情况:1.程序员水平太菜,2.程序逻辑错误. 一旦发生系统会出现超时,关键是有可能你看不到正在活动的php进程,而系统的慢查询日志也不会记录,只能通过show fu ...

  9. 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型,原因为没有注册类

    错误描述 e = {"无法将类型为"System.__ComObject"的 COM 对象强制转换为接口类型"OpcRcw.Da.IOPCServer" ...

  10. asp.net MVC 从其它项目复制过来的Area里面的Controllers文件读取不到

    从其实项目复制过来的Controllers,在访问时显示不存在文件 检查一下对应的area里面的AreaRegistration文件的命名空间是否一致