问题场景:将一条带有关键字字段(该字段的字段值具有唯一性)的记录插入到数据库时,就需要判断该关键字的字段值是否已存在于数据库中,那么会有哪些做法呢?(假设当前的数据库是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; www.2cto.com
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 lstAllFieldValues = new List();
foreach(DataRow dr in queryResultDT.Rows)
{
string currentFieldValue = dr[0].ToString();
if (!lstAllFieldValues.Contains(currentFieldValue))
{
lstAllFieldValues.Add(currentFieldValue);
}
}
if (lstAllFieldValues.Contains(insertFieldValue))
{//当查询出来的行数组不为空,并且至少有一行,则说明数据库中已经存在该关键字的记录,不能插入 www.2cto.com
MessageBox.Show("数据库中已经存在相同字段值的记录,不能插入");
return;
}
else
{
//执行插入等后续工作
}
方法2.2就不再罗列出来了,注意要点是将上次代码中的lstAllFieldValues变量作为一个类的属性或者字段来保存,可以是静态的也可以是实例化的,具体可以看情况来定,要点是运行程序后,只从数据库中读取一次,第一次形成lstAllFieldValues后,就不再释放该变量,然后每次插入或者删除记录时,同步更新lstAllFieldValues该集合中的字段值(相应的添加于删除)。
作者 KingOfFreedom