作为程序员,应该需要具备许许多多的基本功,比如对数据库的增删改查、对基本的控件的熟练使用等。在数据库的插入前,往往需要判断添加的记录是否已经存在于数据库中,如果已经存在则不需要再进行插入操作了。
作为程序员,我们的工作就是不断的遇到问题不断地解决问题。在遇到一些问题之后,在解决问题的过程中,应该有这样一个步骤,就是给自己一些思考时间,去尽可能地找出所有你目前的技术水平能找出的解决方案,然后从中找出最优方案。而不是一上来就利用以往的经验马上去做,或者以找到一个解决方案就直接去做,直到发现该方案做起来很复杂或者太费劲而中止,再去想其他的解决方案。
问题场景:将一条带有关键字字段(该字段的字段值具有唯一性)的记录插入到数据库时,就需要判断该关键字的字段值是否已存在于数据库中,那么会有哪些做法呢?(假设当前的数据库是MS-SQL)
方法一:在每次插入一条语句前从数据库中查询出包含关键字字段的值,并存入一个Datatable变量中,再利用datatable
的select("KeyFieldValue='"+curFieldValue+'")方法进行二次查询,参考代码如下:
1 string curFieldValue="xxx";//当前要插入到数据库中的关键字的字段值 2 string strQuerySql = "select KeyFieldName from TableName"; 3 //从数据库中查询出该关键字的所有字段值,下面的方法ExecuteDataTable()封装数据库查询,并返回一个包含结果的DataTable 4 DataTable queryResultDT = DataBase.ExecuteDataTable(strQuerySql,DataBase.Config); 5 6 //利用DataTable的Select方法找出相同字段值的记录 7 DataRow[] dr= queryResultDT.Select("FnshChartNo ='"+curFieldValue+"'");//如果为整形等则不需要单引号 8 9 if (dr != null && dr.Length > 0) 10 {//当查询出来的行数组不为空,并且至少有一行,则说明数据库中已经存在该关键字的记录,不能插入 11 MessageBox.Show("数据库中已经存在相同字段值的记录,不能插入"); 12 return; 13 } 14 else 15 { 16 //执行插入等后续工作 17 }
方法二:利用泛型变量来存储所有关键字的字段值,然后每次插入时,都先判断下该字段值是否已经存于该泛型集合中,若不存在,则可以插入。该方法又可以细分为2种方法,一种是每次插入前都重新从数据库中读取所有关键字的字段值,并重新构造该泛型变量;第二种是用该泛型变量存储所有关键字的字段值后,每次插入或者删除记录时,也要将插入或者删除的记录的关键字的字段值从该泛型变量中增加或者移除。
string insertFieldValue="xxx";//当前要插入到数据库中的关键字的字段值 string strQuerySql = "select KeyFieldName from TableName"; //从数据库中查询出该关键字的所有字段值,下面的方法ExecuteDataTable()封装数据库查询,并返回一个包含结果的DataTable DataTable queryResultDT = DataBase.ExecuteDataTable(strQuerySql,DataBase.Config); //以字符型的关键字字段值为例 List<string> lstAllFieldValues = new List<string>(); foreach(DataRow dr in queryResultDT.Rows) { string currentFieldValue = dr[0].ToString(); if (!lstAllFieldValues.Contains(currentFieldValue)) { lstAllFieldValues.Add(currentFieldValue); } } if (lstAllFieldValues.Contains(insertFieldValue)) {//当查询出来的行数组不为空,并且至少有一行,则说明数据库中已经存在该关键字的记录,不能插入 MessageBox.Show("数据库中已经存在相同字段值的记录,不能插入"); return; } else { //执行插入等后续工作 }
方法2.2就不再罗列出来了,注意要点是将上次代码中的lstAllFieldValues变量作为一个类的属性或者字段来保存,可以是静态的也可以是实例化的,具体可以看情况来定,要点是运行程序后,只从数据库中读取一次,第一次形成lstAllFieldValues后,就不再释放该变量,然后每次插入或者删除记录时,同步更新lstAllFieldValues该集合中的字段值(相应的添加于删除)。
ps:大家都还有其他什么方法?可以亮出来瞧瞧,希望本文起到抛砖引玉的作用。