基于.NET平台的Windows编程实战(七)问卷统计功能的实现(下)

2.合并统计的实现


图7-2

从上面的图中,想必大家已经猜到了问卷的合并方法了吧,是的,我们是通过从外部导入数据的方法来进行合并的,其设计的原型是这样来的:比如我们有20份收回来的问卷,分别由A某和B某2个工作人员进行统计,各统计10份,B某统计好了后,将其统计的数据库导出来并COPY给了A某,A某拿到B某的的数据库后,就可以通过上图7-2中的“浏览”查找到B某的数据库,并选择需要合并统计的问卷后,点“确定合并”,系统便可自行进行合并统计了。其实现的代码如下所示: 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;//引入文件操作类库

namespace LJ_QuestionnaireSystem
{
 /**//// <summary>
 /// Name:合并问卷统计类
 /// Author:Asidy
 /// Time:2009.04.26gtf
 /// </summary>
 public partial class SurveyStUnite : SurveryWin
 {
  public SurveyStUnite()
  {
   InitializeComponent();
  }
   //初始化问卷列表:将问卷绑定到SurveyComBox控件上
  private void SurveyStUnite_Load(object sender, EventArgs e)
  {
  string sql = "Select id,Survey_Name From Lj_Survey";//查询问卷列表
  DataTable sdt = dboperate.GetDataTable(sql);//得到查询出的问卷数据表
  if (sdt.Rows.Count > 0)   //如果问卷存在则进行如下操作
  {
   SurveyComBox.DataSource = sdt; //设置SurveyComBox的数据源为sdt
   SurveyComBox.DisplayMember = "Survey_Name"; //将问卷名绑定到SurveyComBox列表项的显示属性上,用来显示问卷名
   SurveyComBox.ValueMember = "id"; //将问卷的ID值绑定到SurveyComBox列表项的实际值属性上,以便操作时获取其ID值进行查询
  }
 }
 /**//// <summary>
 /// 查找合并统计的数据库文件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void FindFolderBt_Click(object sender, EventArgs e)
 {
  OpenFileDialog opf = new OpenFileDialog();//实例化一个打开对话框对象
  opf.Filter = "Access数据库文件(*.mdb)|*.mdb";//设置文件类型
  opf.Title = "选择合并的数据库";//设置对话框标题
  opf.RestoreDirectory = true;//对话框关闭还原到当前目录
  if (opf.ShowDialog() == DialogResult.OK) //如果对话框返回OK,则执行如下操作
  {
   StatDbFileTxt.Text = opf.FileName; //将查找合并的数据库文件名赋值给StatDbFileTxt控件
  }

  opf.Dispose();//释放对话框所使用的资源
 }
 /**//// <summary>
 /// StatDbFileTxt中的内容改变时引发此事件
 /// 即当用户输入或选择合并的数据库时引发此事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void StatDbFileTxt_TextChanged(object sender, EventArgs e)
 {
  if (StatDbFileTxt.Text.Trim() != "") //如果StatDbFileTxt中的内容不为空时,执行如下操作,否则弹出提示对话框
  {
   SureUniteBtn.Enabled = true;//将"确定合并"按钮设置为可操作状态
   CancelBtn.Enabled = true;
   try
   { //捕获异常
    if (StatDbFileTxt.Text.Trim().Substring(StatDbFileTxt.Text.LastIndexOf('.')) != ".mdb")
    {//如果用户输入或选择的数据库文件不是以.mdb为扩展名的文件,则弹出提示对话框,并将"确定合并"按钮设置为不可操作状态
     MessageBox.Show("请输入或选择正确的数据库路径!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
     SureUniteBtn.Enabled = false;//将"确定合并"按钮设置为不可操作状态
    }
    else
    {
     SureUniteBtn.Enabled = true;//将"确定合并"按钮设置为可操作状态
     string dbpath = @"..\..\DataBase\1.mdb"; //定义数据库缓存名及路径,用来缓存合并的数据库.注意:发布是设为:@"DataBase\1.mdb"
     try
      {//捕获异常
       File.Copy(StatDbFileTxt.Text.Trim(), dbpath, true);//将用户输入或选择合并统计的数据库缓存到dbpath设置的路径中
      }
      catch (FileNotFoundException)
       {//如果没有找到用户输入或选择合并统计的数据库,则弹出提示对话框,并将"确定合并"按钮设置为不可操作状态
        MessageBox.Show("请输入或选择正确的数据库路径!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        SureUniteBtn.Enabled = false;//将"确定合并"按钮设置为不可操作状态
       }
      catch (Exception)
       {//如果引发其它异常,则弹出提示对话框,并将"确定合并"按钮设置为不可操作状态
        MessageBox.Show("导入合并的数据库缓存出错!可能是系统盘空间不够或系统的安装目录访问权限不够,建议将系统安装到非系统盘(即操作系统安装盘以外的其它盘)再试试!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        SureUniteBtn.Enabled = false;//将"确定合并"按钮设置为不可操作状态
       }
    }
   }
   catch(Exception)
   {//如果引发其它异常,则弹出提示对话框,并将"确定合并"按钮设置为不可操作状态
    MessageBox.Show("请输入或选择正确的数据库路径!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    SureUniteBtn.Enabled = false;//将"确定合并"按钮设置为不可操作状态
    }
   }
 }

 DbOperate dboperate = new DbOperate();//实例化一个数据库操作对象,用来操作数据库
 /**//// <summary>
 /// 当用户点击"确定合并"按钮时引发此事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void SureUniteBtn_Click(object sender, EventArgs e)
 {
  if (AllStatChBox.Checked)  //如果选择了"全部合并",则执行如下操作
  {
   DataTable surveydt = dboperate.GetTable("Select id From Lj_Survey"); //获取用户选择导入合并统计的数据库中的对应问卷数据表
   if (surveydt.Rows.Count > 0)  //如果存在问卷,则执行如下操作
    {
     SureUniteBtn.Text = "正在合并……";
     SureUniteBtn.Enabled = false;
     CancelBtn.Enabled = false;
     string rSql = "", upSql = ""; //分别定义二个字符串,用来存放SQL语句
     DataTable rdt;//定义一个数据表,用来存放相应问卷下的题目选项
     int jjj = 0;//用来判断是否合并成功
     for (int si = 0; si < surveydt.Rows.Count; si++) //循环查询每一个问卷
     {
      //将用户导入合并统计的数据库中对应问卷下题目的选项查询语句存入rSql中
      rSql = "Select Result_Sid,Result_Tid,Result_Content,Result_Count From Lj_Result Where Result_Sid=" + Convert.ToInt32(surveydt.Rows[si][0]);
      rdt = dboperate.GetTable(rSql);//获取用户选择导入合并统计的数据库中的对应问卷下题目的选项数据表
      int jj = 0; //用来判断是否执行了合并操作
      if (rdt.Rows.Count > 0) //如果存在此选项数据表,则执行如下操作
       {
        proBar.Visible = true; //将进度条设为可见
        proBar.Minimum = 0; //设置进度条的起始值为0
        proBar.Maximum = rdt.Rows.Count; //设置进度条的最大值为选项数据表的总行数
        for (int ii = 0; ii < rdt.Rows.Count; ii++) //将每一条对应的数据进行合并更新到现有数据库中
        {
         //将现有数据库中对应项的更新语句存入upSql中
         upSql = "Update Lj_Result Set Result_Count=Result_Count+" + Convert.ToInt32(rdt.Rows[ii][3]) + " Where Result_Sid=" + Convert.ToInt32(rdt.Rows[ii][0]) + " and Result_Tid=" + Convert.ToInt32(rdt.Rows[ii][1]) + " and Result_Content='" + rdt.Rows[ii][2].ToString() + "'";
         if (dboperate.ExcuteIntSql(upSql) > 0)
         {
          jj++;//如果更新成功,则加1
         }
         proBar.Value = ii + 1; //进度条的当前值也加1
        }
        if (jj > 0) //如果更新成功,则执行如下操作:继续更新对应问卷的统计份数
         {
          //获得用户导入合并统计的数据库中对应问卷的统计份数
          int surveyCount = dboperate.ExcueteIntSql("Select Survey_Count From Lj_Survey Where id=" + Convert.ToInt32(surveydt.Rows[si][0]));
          //将现有数据库中对应问卷的统计份数加上导入合并统计数据库中对应问卷的统计份数,并执行更新操作
          string sSql = "Update Lj_Survey Set Survey_Count=Survey_Count+" + surveyCount + " Where id=" + Convert.ToInt32(surveydt.Rows[si][0]);
          dboperate.ExcuteSql(sSql); //执行更新操作
         }
        }
        jjj = jjj + jj;//将判断合并成功与否的数据加上更新的条数,用来判断是否更新成功
       }
       if (jjj > 0) //如果大于0,则表示更新成功,执行如下操作;否则弹出合并失败提示对话框
        {
         SureUniteBtn.Text = "合并成功";
         CancelBtn.Enabled = true;
         MessageBox.Show("合并成功,请刷新相应列表!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
         try
          {//捕获删除异常
           File.Delete(@"..\..\DataBase\1.mdb");//删除合并的缓存数据库.注意:发布是设为:@"DataBase\1.mdb"
          }
         catch (Exception) //如果出现异常,则跳过
          {
          }
          this.Close();//关闭当前窗口
          }
          else
          {
           SureUniteBtn.Text = "合并失败";
           CancelBtn.Enabled = true;
           MessageBox.Show("合并失败,请检查导入合并的数据库是否正确!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
          }
        }
        else
        { //如果不存在问卷,则弹出提示对话框
         SureUniteBtn.Text = "确定合并";
         SureUniteBtn.Enabled = true;
         CancelBtn.Enabled = true;
         MessageBox.Show("导入合并的数据库中没有问卷!请检查导入合并的数据库!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
          //this.Close();
          }
        }
        else
        { //如果没有选择"全部合并",则执行如下操作
         int surveyId = Convert.ToInt32(SurveyComBox.SelectedValue); //获取当前选择合并的问卷ID
         if (StatDbFileTxt.Text.Trim() != "")//如果用户输入或选择导入合并统计的数据库不为空,则执行如下操作;否则弹出提示框
         {
          //将用户导入合并统计的数据库中对应问卷下题目的选项查询语句存入sql中
          string sql = "Select Result_Sid,Result_Tid,Result_Content,Result_Count From Lj_Result Where Result_Sid=" + surveyId;
          DataTable dt = dboperate.GetTable(sql);//获取用户选择导入合并统计的数据库中的对应问卷下题目的选项数据表

          if (dt.Rows.Count > 0) //如果此选项数据表不为空,则执行如下操作;否则弹出提示框
           {
            SureUniteBtn.Text = "正在合并……";
            SureUniteBtn.Enabled = false;
            CancelBtn.Enabled = false;
            string tSql = "";
            int j = 0;//用来判断是否执行了更新操作
            proBar.Visible = true; //将进度条设为可见
            proBar.Minimum = 0;//将进度条的起始值设为0
            int cout = dt.Rows.Count;//选项数据表的总行数
            proBar.Maximum = cout;//设置进度条的最大值为选项数据表的总行数
            for (int i = 0; i < cout; i++) //将每一条对应的数据进行合并更新到现有数据库中
             {
              //将现有数据库中对应项的更新语句存入upSql中
               tSql = "Update Lj_Result Set Result_Count=Result_Count+" + Convert.ToInt32(dt.Rows[i][3]) + " Where Result_Sid=" + Convert.ToInt32(dt.Rows[i][0]) + " and Result_Tid=" + Convert.ToInt32(dt.Rows[i][1]) + " and Result_Content='" + dt.Rows[i][2].ToString() + "'";
             if (dboperate.ExcuteIntSql(tSql) > 0)
              {
               j++;//如果更新成功,则加1
              }
             proBar.Value = i + 1; //进度条的当前值也加1
             }
            if (j > 0) //如果更新成功,则执行如下操作:继续更新对应问卷的统计份数;否则弹出合并失败提示对话框
            {
             SureUniteBtn.Text = "合并成功";
             CancelBtn.Enabled = true;
             //获得用户导入合并统计的数据库中对应问卷的统计份数
             int surveyCount = dboperate.ExcueteIntSql("Select Survey_Count From Lj_Survey Where id=" + surveyId);
             //将现有数据库中对应问卷的统计份数加上导入合并统计数据库中对应问卷的统计份数,并执行更新操作
             string sSql = "Update Lj_Survey Set Survey_Count=Survey_Count+" + surveyCount + " Where id=" + surveyId;
             dboperate.ExcuteSql(sSql);//执行更新操作
             MessageBox.Show("合并成功,请刷新相应列表!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
             try
             { //捕获删除异常
              File.Delete(@"..\..\DataBase\1.mdb");//删除合并的缓存数据库.注意:发布是设为:@"DataBase\1.mdb"
             }
             catch (Exception) //如果出现异常,则跳过
             {
             }
             this.Close();//关闭当前窗口
          }
        else
        {
         SureUniteBtn.Text = "合并失败";
         CancelBtn.Enabled = true;
         MessageBox.Show("合并失败,请检查导入合并的数据库是否正确!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
      }
    else
     {
      SureUniteBtn.Text = "确定合并";
      SureUniteBtn.Enabled = true;
       CancelBtn.Enabled = true;
      MessageBox.Show("没有找到相对应的问卷,请检查导入合并的数据库中是否包含有相对应的问卷!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
      //this.Close();
     }
   }
   else
   {
    SureUniteBtn.Text = "确定合并";
    SureUniteBtn.Enabled = true;
    CancelBtn.Enabled = true;
    MessageBox.Show("请输入或选择要导入合并的数据库路径!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
   }
  }
  }
 /**//// <summary>
 /// 当用户点击"全部合并"选项时引发此事件
 /// </summary>
 /// <param name="sender"></param>
  /// <param name="e"></param>
 private void AllStatChBox_CheckedChanged(object sender, EventArgs e)
  {
   //如果点选了"全部合并",则不可再选择问卷;反之,则可
   if (AllStatChBox.Checked)
    {
     SurveyComBox.Enabled = false;
    }
    else
    {
     SurveyComBox.Enabled = true;
    }
  }
 }
}

OK,本课程就先到这里,如有其它不清楚或疑惑的地方,请在下面留言说明,我将尽全力给予解答,希望能给大家带来一点帮助!谢谢的大家支持……

时间: 2024-07-31 03:01:26

基于.NET平台的Windows编程实战(七)问卷统计功能的实现(下)的相关文章

艾伟_转载:基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 首先,为了使我们的界面更加便于操作及布局,我们引入第三开源控件DockPanel[当然也可以不引入控件而直接进行开发],你可以从这里:Do

艾伟:基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 首先,为了使我们的界面更加便于操作及布局,我们引入第三开源控件DockPanel[当然也可以不引入控件而直接进行开发],你可以从这里:Do

艾伟:基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 大家都知道本系统的正常运行少不了数据库操作这一块,且其在本系统中具有决定性作用,可以说没有它的操作系统将无法运行,故在本节课程中,专门把针

艾伟:基于.NET平台的Windows编程实战(一)——前言

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 前言:本系列文章是一个关于.NET Windows编程的入门实战教程.通过一个完整的真实案例:问卷调查管理系统,全面展示了基于.NET平台

艾伟_转载:基于.NET平台的Windows编程实战(二)—— 需求分析与数据库设计

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 大家都知道一个系统的成败与否关键在于其所做的需求分析是否到位,数据库的设计是否合理.因为本系列文章的目的是在于提高大家对.NET Wind

艾伟_转载:基于.NET平台的Windows编程实战(六)—— 题目管理功能的实现

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 申明:本系列课程是专为新手们写来入门练习用的,目的是想通过一个完整的问卷调查管理系统的案例开发来让新手们了解.加深或是熟悉软件项目的开发流

艾伟_转载:基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 大家都知道本系统的正常运行少不了数据库操作这一块,且其在本系统中具有决定性作用,可以说没有它的操作系统将无法运行,故在本节课程中,专门把针

艾伟_转载:基于.NET平台的Windows编程实战(一)——前言

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 前言:本系列文章是一个关于.NET Windows编程的入门实战教程.通过一个完整的真实案例:问卷调查管理系统,全面展示了基于.NET平台

基于.NET平台的Windows编程实战(一)前言

本系列文章导航 基于.NET平台的Windows编程实战(一)前言 基于.NET平台的Windows编程实战(二) 需求分析与数据库设计 基于.NET平台的Windows编程实战(四) 数据库操作类的编写 基于.NET平台的Windows编程实战(五) 问卷管理功能的实现 基于.NET平台的Windows编程实战(六) 题目管理功能的实现 前言:本系列文章是一个关于.NET Windows编程的入门实战教程.通过一个完整的真实案例:问卷调查管理系统,全面展示了基于.NET平台的Windows编程

基于.NET平台的Windows编程实战(六) 题目管理功能的实现

本系列文章导航 基于.NET平台的Windows编程实战(一)前言 基于.NET平台的Windows编程实战(二) 需求分析与数据库设计 基于.NET平台的Windows编程实战(四) 数据库操作类的编写 基于.NET平台的Windows编程实战(五) 问卷管理功能的实现 基于.NET平台的Windows编程实战(六) 题目管理功能的实现 申明:本系列课程是专为新手们写来入门练习用的,目的是想通过一个完整的问卷调查管理系统的案例开发来让新手们了解.加深或是熟悉软件项目的开发流程及在.NET平台上