天天看點

C#批量添加資料的問題

    最近在考試系統的二期維護中,負責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已經存在的問題了