作為程序員,應該需要具備許許多多的基本功,比如對數據庫的增刪改查、對基本的控件的熟練使用等。在數據庫的插入前,往往需要判斷添加的記錄是否已經存在於數據庫中,如果已經存在則不需要再進行插入操作了。
作為程序員,我們的工作就是不斷的遇到問題不斷地解決問題。在遇到一些問題之后,在解決問題的過程中,應該有這樣一個步驟,就是給自己一些思考時間,去盡可能地找出所有你目前的技術水平能找出的解決方案,然后從中找出最優方案。而不是一上來就利用以往的經驗馬上去做,或者以找到一個解決方案就直接去做,直到發現該方案做起來很復雜或者太費勁而中止,再去想其他的解決方案。
問題場景:將一條帶有關鍵字字段(該字段的字段值具有唯一性)的記錄插入到數據庫時,就需要判斷該關鍵字的字段值是否已存在於數據庫中,那么會有哪些做法呢?(假設當前的數據庫是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:大家都還有其他什么方法?可以亮出來瞧瞧,希望本文起到拋磚引玉的作用。