接着上节的内容,本节应该设计F_HaveBack窗体和F_User窗体,前者是用来对数据库文件的操作,比如数据库文件的还原和备份,而后者则是实现系统使用人员的基本操作,如增添,删除,修改等。
按照前几节的流程,我们类似的先进行界面的设计,闲话不多说,我们先展示一下简单的界面设计:
界面的设计中使用了一个tabControl控件将其分为两个部分,一个事数据库的备份功能的实现,切换之后是数据库的还原的操作。
在备份数据库页面中,使用了两个radioButton控件来选择或者是更改路径,通过Button按钮来控制过程的进行,在还原数据库页面中,通过设计一个按钮来让用户通过对话框选择还原路径,从而进行还原。
下面要说的是这两个页面的实现:
1.首先进行变量的定义:
DataClass.MyMeans MyDataClass = new DataClass.MyMeans();2.当点击备份按钮时,这时会触发其Click事件,事件的实现过程如下:
ModuleClass.MyModule MyMC = new ModuleClass.MyModule();
private void button1_Click(object sender, EventArgs e)3.当点击“放大镜'按钮时,执行路径浏览操作:
{
//button1_Click事件为备份数据库
string Str_dar = "";
//选择并设置默认路径
if (radioButton1.Checked == true)
{
Str_dar = System.Environment.CurrentDirectory + "\\bar\\";
}
//选择其他路径
if (radioButton2.Checked == true)
{
Str_dar = textBox2.Text + "\\";
}
if (textBox2.Text == "" & radioButton2.Checked == true)
{
MessageBox.Show("请选择备份数据库文件的路径。");
return;
}
//尝试数据库的备份
try
{
//定义SQL语句实现到指定时间点的还原
Str_dar = "backup database db_PWMS to disk='" + Str_dar + (System.DateTime.Now.ToShortDateString()).ToString() + MyMC.Time_Format(System.DateTime.Now.ToString()) + ".bak" + "'";
//将指令在MyClass类中的GetA_M_D_command进行对数据库的操作执行
MyDataClass.GetA_M_D_command(Str_dar);
//弹出提示信息的对话框
MessageBox.Show("数据备份成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
//提示返回的错误信息
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//浏览路径4.接下来设计数据库的还原操作:当在数据库还原页面中点击还原时,将触发其Click事件,事件的实现过程如下:
private void button2_Click(object sender, EventArgs e)
{
//调用文件路径对话框
if (folderBrowserDialog1.ShowDialog(this) == DialogResult.OK)
{
textBox2.Text = folderBrowserDialog1.SelectedPath;
}
}
//还原数据库操作同样的当点击”放大镜“时,将会使用户选择路径下已有的还原文件
private void button5_Click(object sender, EventArgs e)
{
//当文件路径为空时
if (textBox3.Text == "")
{
MessageBox.Show("请选择备份数据库文件的路径。");
return;
}
//尝试还原工作
try
{
//判断数据库的连接状态,若连接则断开连接
if (DataClass.MyMeans.My_Con.State == ConnectionState.Open)
{
DataClass.MyMeans.My_Con.Close();
}
//数据库连接语句,指向master数据库
string DateStr = "Data Source=MRDEL\\MRDEL;Database=master;User id=sa;PWD=";
//同时建立一个新的SqlConnection对象
SqlConnection conn = new SqlConnection(DateStr);
//打开数据库连接
conn.Open();
//-------------------杀掉所有连接 db_PWMS 数据库的进程--------------
//定义sql语句,以及所使用的变量
string strSQL = "select spid from master..sysprocesses where dbid=db_id( 'db_PWMS') ";
SqlDataAdapter Da = new SqlDataAdapter(strSQL, conn);
DataTable spidTable = new DataTable();
Da.Fill(spidTable);
//向SqlCommand对象中传递Text指令
SqlCommand Cmd = new SqlCommand();
Cmd.CommandType = CommandType.Text;
Cmd.Connection = conn;
//通过循环构成强行关闭用户进程的命令指令
for (int iRow = 0; iRow <= spidTable.Rows.Count - 1; iRow++)
{
Cmd.CommandText = "kill " + spidTable.Rows[iRow][0].ToString(); //强行关闭用户进程
Cmd.ExecuteNonQuery();
}
//关闭并释放资源
conn.Close();
conn.Dispose();
//--------------------------------------------------------------------
//建立新的SqlConnection对象
SqlConnection Tem_con = new SqlConnection(DateStr);
//连接数据库
Tem_con.Open();
//第一个参数为一个完整的SQL语句,用于查找对应的还原文件
SqlCommand SQLcom = new SqlCommand("backup log db_PWMS to disk='" + textBox3.Text.Trim() + "' restore database db_PWMS from disk='" + textBox3.Text.Trim() + "'", Tem_con);
//进行查询
SQLcom.ExecuteNonQuery();
SQLcom.Dispose();
Tem_con.Close();
Tem_con.Dispose();
MessageBox.Show("数据还原成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
MyDataClass.con_open();
MyDataClass.con_close();
//为保证数据的安全性,强制关闭整个系统
MessageBox.Show("为了避免数据丢失,在数据库原还后将关闭整个系统。");
Application.Exit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void button4_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "*.bak|*.bak";
if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
{
textBox3.Text = openFileDialog1.FileName;
}
}
当点击取消时,只需要在其Click事件中添加this.Close();语句即可。到此,F_HaveBack窗体基本设计完成了。
接下来设计F_users窗体,这个窗体的作用在前面已经提到,所以,我们直接上其设计的界面:
界面较为简单,一个toolStrip工具栏,一个GroupBox控件,以及一个GridView控件。
代码部分实现的过程如下:
这个窗口的功能的实现主要依托于MyMeans类的对象,变量的定义如下:
DataClass.MyMeans MyDataClass = new DataClass.MyMeans();当窗体加载时,我们通过其load事件完成一些任务:
public static DataSet MyDS_Grid;
private void F_User_Load(object sender, EventArgs e)而窗体处于活动状态时,则会显示从指定表中得到的查询内容:
{
//从指定表进行查询
MyDS_Grid = MyDataClass.GetDataSet("select ID as 编号,Name as 用户名 from tb_Login", "tb_Login");
dataGridView1.DataSource = MyDS_Grid.Tables[0];
}
private void F_User_Activated(object sender, EventArgs e)
{
MyDS_Grid = MyDataClass.GetDataSet("select ID as 编号,Name as 用户名 from tb_Login", "tb_Login");
dataGridView1.DataSource = MyDS_Grid.Tables[0];
}
private void tool_Close_Click(object sender, EventArgs e)
{
this.Close();
}
当点击添加,修改,删除等按钮时毁掉应相应的窗体,相应的通过调用这些按钮的Click事件,调用响应的窗体,完成相应的功能,事件中包含的窗体将在后续的节次中进行详细的设计说明:
//调用添加用户窗体
private void tool_UserAdd_Click(object sender, EventArgs e)
{
//初始化窗体
Perform.F_UserAdd FrmUserAdd = new F_UserAdd();
//设置tag
FrmUserAdd.Tag = 1;
FrmUserAdd.Text = tool_UserAdd.Text + "用户";
FrmUserAdd.ShowDialog(this);
}
//实现修改操作
private void tool_UserAmend_Click(object sender, EventArgs e)
{
//判断是否是超级用户
if (ModuleClass.MyModule.User_ID.Trim() == "0001")
{
MessageBox.Show("不能修改超级用户。");
return;
}
Perform.F_UserAdd FrmUserAdd = new F_UserAdd();
FrmUserAdd.Tag = 2;
FrmUserAdd.Text = tool_UserAmend.Text + "用户";
FrmUserAdd.ShowDialog(this);
}
//权限设置 private void tool_UserPopedom_Click(object sender, EventArgs e) { //判断是否为超级用户 if (ModuleClass.MyModule.User_ID.Trim() == "0001") { MessageBox.Show("不能修改超级用户权限。"); return; } F_UserPope FrmUserPope = new F_UserPope(); FrmUserPope.Text = "用户权限设置"; FrmUserPope.ShowDialog(this); } private void tool_UserDelete_Click(object sender, EventArgs e) { //判断是否尾插即用户,如是则不能进行删除操作 if (ModuleClass.MyModule.User_ID != "") { if (ModuleClass.MyModule.User_ID.Trim() == "0001") { MessageBox.Show("不能删除超级用户。"); return; } MyDataClass.GetA_M_D_command("Delete tb_Login where ID='" + ModuleClass.MyModule.User_ID.Trim() + "'"); MyDataClass.GetA_M_D_command("Delete tb_UserPope where ID='" + ModuleClass.MyModule.User_ID.Trim() + "'"); MyDS_Grid = MyDataClass.GetDataSet("select ID as 编号,Name as 用户名 from tb_Login", "tb_Login"); dataGridView1.DataSource = MyDS_Grid.Tables[0]; } else MessageBox.Show("无法删除空数据表。"); }为了能够正确的显示所得到的结果,需要设计GridView的CellEnter事件,当选中记录时可以使用菜单栏上的按钮,反之则不能够使用,过程如下:
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)至此,两个窗体基本设计完成,下节将设计,人事档案浏览窗体,F_ManFile窗体。
{
if (dataGridView1.RowCount > 1)
{
//设置GridView控件中的显示内容
ModuleClass.MyModule.User_ID = dataGridView1[0, dataGridView1.CurrentCell.RowIndex].Value.ToString();
ModuleClass.MyModule.User_Name = dataGridView1[1, dataGridView1.CurrentCell.RowIndex].Value.ToString();
//对菜单栏控件的可用性进行设置
tool_UserAmend.Enabled = true;
tool_UserDelete.Enabled = true;
tool_UserPopedom.Enabled = true;
}
else
{
ModuleClass.MyModule.User_ID = "";
ModuleClass.MyModule.User_Name = "";
tool_UserAmend.Enabled = false;
tool_UserDelete.Enabled = false;
tool_UserPopedom.Enabled = false;
}
}