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,本課程就先到這裡,如有其它不清楚或疑惑的地方,請在下面留言說明,我將盡全力給予解答,希望能給大家帶來一點幫助!謝謝的大家支持……