最近在考試系統的二期維護中,負責IP的部分。其中涉及到了批量添加IP的問題。
起初,維護的初衷為是了實作IP與考場的綁定。大家知道,維護的過程就是在優化,在一期中已經能夠實作批量添加IP的功能,利用的是循環逐條添加IP。但是存在這樣一個問題,就是在批量添加IP之前,需要驗證IP是否已經存在。其實驗證是非常簡單的,關鍵是驗證IP是否存在和添加IP都嵌套在循環中,如果單純在If邏輯語句中調用查詢函數,會導緻這樣的情況:就是添加多少條記錄(假定這幾條記錄資料庫中都存在),就會彈出多少個對話框提示“您添加的IP已經存在!”。這樣不符合實際的要求。而且為了使使用者體驗度提高,要提示出具體哪些IP是已經存在的,以確定使用者能夠準确識别IP添加成功與否。
因為批量添加IP是嵌套在一個for循環中,是以每次隻能來一條記錄,我們的目的是先驗證IP是否存在,如果存在則捕獲這些存在的IP,不存在的則添加到資料庫中。是以起初的代碼是這樣寫的
for (int i = int.Parse(txtStart4.Text.Trim()); i < int.Parse(txtEnd4.Text.Trim()) + 1; i++)
{
string strIP = txtStart1.Text.Trim() + "." + txtStart2.Text.Trim() + "." + txtStart3.Text.Trim() + ".";
//收集IP資訊
strIP = strIP + i.ToString().Trim();
string strLike = " IP Like '%" + strIP.ToString().Trim() + "%' and IsNoShow='True'";
EControlIP.IsNoShow = "True"; //擷取是否顯示IP
EControlIP.IsNoAccept = true; //擷取是否進行IP控制
EControlIP.IP = strIP.ToString().Trim(); //擷取IP的值
EControlIP.College = DropDep.Text.Trim(); //擷取學院的值
EControlIP.Course = DropCourse.Text.Trim(); //擷取課程的值
EControlIP.ExamMainID = DropExam.Text.Trim(); //擷取考試的值
EControlIP.ExamPlaceID = DropExamRoom.Text.Trim(); //擷取考場的值
//添加IP
//判斷要添加的IP是否存在
dtIP = admUserManager.QueryIP(strLike);
if (dtIP.Rows.Count!=0)
{
lblShowIP.Text = ""; //清空文本框
string strRepeatIP;
strRepeatIP = dtIP.Rows[0]["IP"].ToString().Trim();
arr.Add(strRepeatIP);
j = j + 1;
//在文本框中顯示重複的IP
for (int h = 0; h < arr.Count; h++)
{
lblShowIP.Text += (string)arr[h] + "\r\n";
}
}
//如果要添加的IP存在則提示資訊
else
{
//如果不存在則調用添加IP函數
flag = admUserManager.AddIp(EControlIP);
//如果傳回值為True則出現提示資訊添加成功
if (flag)
{
Response.Write("<script Language='JavaScript'>alert('添加成功!');window.location.href='AdmQueryIP.aspx';</script>");
}
//否則提示添加失敗
else
{
Response.Write("<script Language='JavaScript'>alert('添加失敗!')</script>");
}
}
}
但是問題又出現了,就是如果我批量添加的IP中有部分重複,如果最後一條IP資料庫中不存在,那麼界面就會直接跳轉成“添加成功”,而直接略過了檢索重複IP的界面,使用者也不會看到哪些IP已經存在不能添加。舉個例子,假設資料庫中已經存在192.168.24.1——192.168.24.5,但是當我添加192.168.24.1——192.168.24.10的時候,出現的界面就是“添加成功”,而本應該的檢索已經存在的IP值就會直接被跳轉過去,使用者看不到。是以又做了下面的調整。
for (int i = int.Parse(txtStart4.Text.Trim()); i < int.Parse(txtEnd4.Text.Trim()) + 1; i++)
{
string strIP = txtStart1.Text.Trim() + "." + txtStart2.Text.Trim() + "." + txtStart3.Text.Trim() + ".";
//收集IP資訊
strIP = strIP + i.ToString().Trim();
string strLike = " IP Like '%" + strIP.ToString().Trim() + "%' and IsNoShow='True'";
EControlIP.IsNoShow = "True"; //擷取是否顯示IP
EControlIP.IsNoAccept = true; //擷取是否進行IP控制
EControlIP.IP = strIP.ToString().Trim(); //擷取IP的值
EControlIP.College = DropDep.Text.Trim(); //擷取學院的值
EControlIP.Course = DropCourse.Text.Trim(); //擷取課程的值
EControlIP.ExamMainID = DropExam.Text.Trim(); //擷取考試的值
EControlIP.ExamPlaceID = DropExamRoom.Text.Trim(); //擷取考場的值
//添加IP
//判斷要添加的IP是否存在
dtIP = admUserManager.QueryIP(strLike);
if (dtIP.Rows.Count!=0)
{
lblShowIP.Text = ""; //清空文本框
string strRepeatIP;
strRepeatIP = dtIP.Rows[0]["IP"].ToString().Trim();
arr.Add(strRepeatIP);
j = j + 1;
}
//如果要添加的IP存在則提示資訊
else
{
//如果不存在則調用添加IP函數
flag = admUserManager.AddIp(EControlIP);
}
}
//如果數組裡的長度大于0,證明數組中有重複的IP,則将重複的IP顯示在文本框
if (arr.Capacity > 0)
{
//在文本框中顯示重複的IP
for (int h = 0; h < arr.Count; h++)
{
//出現提示資訊提示您添加的IP已存在或部分存在
MessageBox.Show(this, "您添加的IP已存在或部分存在,已存在的IP顯示在界面下方,請您檢視!");
//将重複的IP顯示在界面下面文本框中
lblShowIP.Text += (string)arr[h] + "\r\n";
//Response.Write("<script Language='JavaScript'>alert('添加失敗!')</script>");
}
}
//傳回值為False則證明沒有重複存在的IP,則提示資訊添加成功!
else
{
Response.Write("<script Language='JavaScript'>alert('添加成功!');window.location.href='AdmQueryIP.aspx';</script>");
}
解決的方案是嵌套一個小循環在驗證IP的部分,但是小循環的初始值等定義需要定義在大循環的外部,不然每進行一次大循環小循環就要重新被寫一遍,把初始值等定義部分放到大循環外部,就會避免這種問題。與此同時,在整個循環進行結束之後,判斷數組的長度,如果數組長度大于0,則證明要添加的IP有部分存在或全部存在,這時候要在界面中顯示出來以提示使用者。相反如果數組長度等于0,則證明添加的IP沒有重複,則提示添加成功。這樣就解決了批量添加IP已經存在的問題了