C#批量添加数据的问题
2014-02-13 20:36
316 查看
最近在考试系统的二期维护中,负责IP的部分。其中涉及到了批量添加IP的问题。
起初,维护的初衷为是了实现IP与考场的绑定。大家知道,维护的过程就是在优化,在一期中已经能够实现批量添加IP的功能,利用的是循环逐条添加IP。但是存在这样一个问题,就是在批量添加IP之前,需要验证IP是否已经存在。其实验证是非常简单的,关键是验证IP是否存在和添加IP都嵌套在循环中,如果单纯在If逻辑语句中调用查询函数,会导致这样的情况:就是添加多少条记录(假定这几条记录数据库中都存在),就会弹出多少个对话框提示“您添加的IP已经存在!”。这样不符合实际的要求。而且为了使用户体验度提高,要提示出具体哪些IP是已经存在的,以确保用户能够准确识别IP添加成功与否。
因为批量添加IP是嵌套在一个for循环中,所以每次只能来一条记录,我们的目的是先验证IP是否存在,如果存在则捕获这些存在的IP,不存在的则添加到数据库中。所以起初的代码是这样写的
但是问题又出现了,就是如果我批量添加的IP中有部分重复,如果最后一条IP数据库中不存在,那么界面就会直接跳转成“添加成功”,而直接略过了检索重复IP的界面,用户也不会看到哪些IP已经存在不能添加。举个例子,假设数据库中已经存在192.168.24.1——192.168.24.5,但是当我添加192.168.24.1——192.168.24.10的时候,出现的界面就是“添加成功”,而本应该的检索已经存在的IP值就会直接被跳转过去,用户看不到。所以又做了下面的调整。
解决的方案是嵌套一个小循环在验证IP的部分,但是小循环的初始值等定义需要定义在大循环的外部,不然每进行一次大循环小循环就要重新被写一遍,把初始值等定义部分放到大循环外部,就会避免这种问题。与此同时,在整个循环进行结束之后,判断数组的长度,如果数组长度大于0,则证明要添加的IP有部分存在或全部存在,这时候要在界面中显示出来以提示用户。相反如果数组长度等于0,则证明添加的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已经存在的问题了
相关文章推荐
- EF大数据批量添加性能问题(续)
- [代码问题记录Q1]c#Listview动态添加数据时阻止重复添加
- C# List<T> Add方法循环添加时只保存了最后一次的数据(覆盖问题)
- 【转】关于批量数据更新的问题(C#高性能)
- c# 将datatable数据批量添加到数据库
- c# 批量添加数据
- 关于批量数据更新的问题(C#高性能)
- jfinal的使用for等循环批量添加数据问题
- C#向数据库添加数据遇到问题——报错“‘*’附近有语法错误”
- 关于批量数据更新的问题(C#高性能)
- c# Sqlite批量添加数据
- [代码问题解决录A1]c#Listview控件动态添加数据并阻止重复添加
- [置顶] 关于C++、C#实现EXCEL数据库批量导入数据库万行以上数据效率问题
- EF大数据批量添加性能问题
- 关于批量数据更新的问题(C#高性能)
- C# excel数据批量导进后添加进数据库中
- sql 批量插入(一个数据库的表数据,添加到另一个数据库表) 数据类型nText和varchar在运算符equals不兼容的问题解决方案
- 【转】C#批量导入数据到sqlserver
- sql server中添加数据是发生外键约束冲突的问题
- C#通过哈希表批量上传数据