##高效工资管理系统主要是实现教职工、部门、工资信息的管理
一、环境搭建
OS为WIN7,其余使用的平台及工具如下:
参考博客:官网下载JDK1.7的方法和步骤(https://blog.csdn.net/liu59412/article/details/82353392)
注意:jdk的版本位数要与Eclipse的版本位数一致,我先前没注意这点,直接下载的64位的jdk(因为我的电脑OS是64位的),安装后报错才发现我的Eclipse是32位的,与安装的jdk位数不一致,后又卸载重新安装的32位的jdk1.7
SQL Server的安装这里不详细介绍了,网上也有许多参考教程。不过有一个错误需要特别说明一下,本人在这折腾了好久
问题:
无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“Microsoft.VisualStudio.OLE.Interop.IServiceProvider”。此操作失败的原因是对 IID 为“{6D5140C1-7436-11CE-8034-00AA006009FA}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))。 (Microsoft.VisualStudio.OLE.Interop)
解决:
错误原因应该和IE的ieproxy.dll文件有关,看了网上的解答,重装IE或许能解决,但我发现我卸载不了IE,最后从别人的电脑(同类型的机器)上拷贝了一份IE文件替换之后,问题解决了。
参考博客:
无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“Microsoft.VisualStudio.OLE.Interop.IServiceProvider”。(https://blog.csdn.net/Shiney927/article/details/40535287)
由于上面的问题我把SQLServer重新安装了好几次,所以这里也附上卸载SQL Server的参考博客:卸载sqlserver2008,完全清除(https://blog.csdn.net/funi16/article/details/8687110)
我安装的版本是jdbc4,下载之后直接把jdbc放在了Eclipse的项目文件夹里,之后在相应的文件夹下配置构建路径(JRE系统库右键选择即可),在添加外部JAR(X)…里打开jdbc即将其添加至引用的库里面了。
参考博客:配置eclipse通过JDBC连接SQl Server 2008R2数据库(https://blog.csdn.net/qinyf2015/article/details/54378070)
java连接sql server 2008和连接sql server 2008(完整版):https://wenku.baidu.com/view/714fb2e319e8b8f67c1cb9d4.html
最后可以进行相应的测试,我的测试代码如下:
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class demo {
public static void main(String[] args) {
String user = "hhh";
String password = "hhhhhhhhhh";
Connection conn;
Statement stmt;
ResultSet rs;
String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Test;";
String sql = "select * from Patient";
try {
// 连接数据库
cOnn= DriverManager.getConnection(url, user, password);
// 建立Statement对象
stmt = conn.createStatement();
// 执行数据库查询语句
rs = stmt.executeQuery(sql);
while (rs.next()) {
String id = rs.getString("PID");
String name = rs.getString("PName");
System.out.println("学号 "+id+"姓名 "+name);
}
if (rs != null) {
rs.close();
rs = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
cOnn= null;
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库连接失败");
}
}
}
二、系统实现
本次实现的系统比较简单,具体的系统ER图如下所示:
根据E-R图向关系模型的转换原则,学校的工资管理系统的实体和联系可以转换为下列关系模式:
管理员(主码:用户号,密码)
教职工(主码:教工号,姓名,性别,年龄,教学背景,所属部门,职称,职务,外码:所属部门编号)
部门(主码:部门编号,部门名称,部门人数,部门负责人)
工资(主码(外码):教工号,基本工资,应加工资,应扣工资,应发工资,实发工资,工资日期,加扣标志)
(1)教职工表
create table Staff(--创建教职工表
Sno NCHAR(10) primary key NOT NULL,
Name VARCHAR(50) NOT NULL,
Gender CHAR(2)CHECK(Gender IN('男','女')),
Age INT NOT NULL,
Education VARCHAR(50),
Department VARCHAR(50) NOT NULL,
Zhicheng VARCHAR(50) not null,
Zhiwu VARCHAR(50) not null,
Dno NCHAR(10) foreign key references Depart(Dno) )
(2)部门表
create table Depart(--创建部门表
Dno NCHAR(10) primary key NOT NULL,
Department VARCHAR(50) NOT NULL,
Num INT NOT NULL,
Header VARCHAR(50) NOT NULL)
(3)工资表
CREATE TABLE Wage(--创建工资表
Sno nchar(10) not null primary key foreign key references Staff(Sno),
Basewage decimal,
Addwage decimal,
Reducewage decimal,
Shouldwage decimal,
Realwage decimal,
Datewage date,
Flag int )
alter table Wage add Taxwage decimal--修改工资表,添加一列个人所得税
alter table Wage add constraint c1 check(Shouldwage=Basewage+Addwage-Reducewage);
alter table Wage add constraint c2 check(Flag in(0,1));
alter table Wage add constraint c3 check(Realwage between 0 and Shouldwage);
alter table Wage add constraint c4 check(Realwage=Basewage+Addwage-Reducewage-Taxwage);
(4)用户登录表
create table UserPwd(--创建用户登录表
Sno NCHAR(10) primary key NOT NULL,
Pwd NCHAR(10) NOT NULL)
(5)管理员登录表
create table AdminPwd(--创建管理员登录表
Sno NCHAR(10) primary key NOT NULL,
Pwd NCHAR(10) NOT NULL)
**创建存储过程来统计某一个月应发的工资总和,这里以2019年12月份为例**
use [SalarySystem] --创建存储过程统计实发工资总和
go
create procedure Sum_Realwage
@Realsalary decimal output
as
select SUM(Realwage) as Sumrealwage from dbo.Wage where '2019-12-01'<=Datewage and Datewage<='2019-12-31'
go
declare @sum decimal--声明输出参数并执行存储过程
exec Sum_Realwage @sum output
print @sum
**创建触发器**
(1)工作表的插入、修改触发器(当往教职工工资项目表中插入记录或更新记录时,自动修改该职工的应发工资数和实发工资数)
create trigger wage_insert_update
on Wage for insert,update
as begin
update Wage set Shouldwage=Basewage+Addwage-Reducewage,Realwage=Basewage+Addwage-Reducewage-Taxwage where Sno in(select Sno from inserted)
end;
(2)教职工插入、删除触发器(当向教职工表里删除或增加一个员工时,部门表对应的部门人数相应变化)
create trigger delete_staff --从教职工表Staff里删除教职工,部门表Depart里的部门人数减1
on Staff after delete
as begin
update Depart set Num=Num-1 where Dno in(select Dno from deleted)
end;
create trigger insert_staff --向教职工表里增加教职工,部门表Depart里的部门人数加1
on Staff after insert
as begin
update Depart set Num=Num+1 where Dno in(select Dno from inserted)
end;
(1). 登录 (增加两个JRadionButton按钮对象rbt1、rtb2和一个标志值flag,通过isSelected()方法判断登录的用户是管理员(令flag=1)还是教职工(flag=0),密码验证通过后根据flag值跳转到不同的功能主界面)
public void isLogin(int flag)//判断登录 {
getDataFromDatabase database=new getDataFromDatabase(); //新建数据库对象
String LoginID =text1.getText();//text1为教工号输入框;
String password=new String(text2.getText());
String pswdDatabase1=String.valueOf(database.getDatabySql("select Pwd from AdminPwd where Sno="+LoginID,"Pwd")); //从数据库导出管理员密码
String pswdDatabase0=String.valueOf(database.getDatabySql("select Pwd from UserPwd where Sno="+LoginID,"Pwd")); //从数据库导出教职工密码
if(flag==1&&password.equals(pswdDatabase1)){ //管理员登录
setVisible(false);
new MainWindow();//管理员的功能主界面
dispose();
}
else if(flag==0&password.equals(pswdDatabase0)){ //教职工登录
setVisible(false);
new LimitedWindow();//教职工登录的主界
dispose();
}
else if(LoginID.equals("0")&&password.equals("0")){
setVisible(false);
dispose();
}
else { //账号或密码错误,清空输入框的内容
JOptionPane.showMessageDialog(null,"用户名或密码错误","通知",JOptionPane.WARNING_MESSAGE);
g1.clearSelection();//g1是一个按钮组,包含了rbt1和rtb2,清空单击按钮 text1.setText(""); //清空输入框
text2.setText("");
}
}
(2) 数据库连接查询 (封装数据库的连接和查询方法,传入参数String sql是要执行的SQL语句、String item是从数据库返回的要查询的属性值,返回类型是String,若查询不到,返回的String为空值)
public String getDatabySql(String sql,String item){
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=SalarySystem;";
try {
cOnn= DriverManager.getConnection(url, "zcf", "zhuchengfei"); 连接数据库
stmt = conn.createStatement(); // 建立Statement对象发送SQL语句
rs = stmt.executeQuery(sql); // 执行数据库查询语句
while (rs.next()) { //rs.next()返回布尔值,且光标跳转到下一行
return (rs.getString(item).trim());//返回一个具体的属性值
}
if (rs != null) { rs.close(); rs = null; }
if (stmt != null) {stmt.close();stmt = null;}
if (conn != null) { conn.close(); cOnn= null; }
return "";
}
catch (SQLException e) {
e.printStackTrace();System.out.println("数据库连接失败");
}
return "";//查询不到,返回空
}
【1】官网下载JDK1.7的方法和步骤https://blog.csdn.net/liu59412/article/details/82353392
【2】无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“Microsoft.VisualStudio.OLE.Interop.IServiceProvider”https://blog.csdn.net/Shiney927/article/details/40535287
【3】卸载sqlserver2008,完全清除https://blog.csdn.net/funi16/article/details/8687110
【4】配置eclipse通过JDBC连接SQl Server 2008R2数据库(https://blog.csdn.net/qinyf2015/article/details/54378070)
【5】java连接sql server 2008和连接sql server 2008(完整版):https://wenku.baidu.com/view/714fb2e319e8b8f67c1cb9d4.html