您的位置:首页 > 编程语言 > C#

C#批量添加数据的问题

2014-02-13 20:36 316 查看
    最近在考试系统的二期维护中,负责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已经存在的问题了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# 数据