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