2011-11-30 41 views
1

我有一個DataTable dt與2列。第一列(稱爲CustomerId)是唯一的,不允許出現空值。第二個允許空值,並不是唯一的。DataTable查找或如果找不到插入行

從一個方法我得到一個CustomerId,然後我想要插入一個新的記錄,如果這個CustomerId不存在或增加1什麼在對應於該CustomerId的第二列,如果它存在。

我不知道我該如何處理這個問題。我寫了一個select語句(它返回System.Data.DataRow),但我不知道如何測試它是否返回一個空字符串。

目前我有:

//I want to insert a new row 
if (dt.Select("CustomerId ='" + customerId + "'") == null) //Always true :| 
    { 
     DataRow dr = dt.NewRow(); 
     dr["CustomerId"] = customerId; 
    } 

回答

1

如果datatable正在填充數據庫。我會建議使customerid成爲一個身份專欄。 (取決於你如何設置你的身份列)

我會檢查這是從返回的行數,當你添加新行會自動創建一個新的客戶ID,這將是獨一無二的,1比以前的ID大於方式選擇語句。喜歡的東西

我也將使用的String.format ...

因此,它看起來像這樣

var selectStatement = string.Format("CustomerId = {0}", customerId); 
var rows = dt.Select(selectStatement); 
if (rows.Count < 1){ 
    var dr = dt.NewRow(); 
    dr["CustomerId"] = customerId; 
} 
-1

Select方法返回DataRow對象的數組。只要檢查它的長度是否爲零(它從不是null)。

順便說一句,不要在代碼中直接編寫這樣的語句,就像在這個例子中一樣。有一種技術可以破壞您的代碼的安全性,稱爲「SQL注入」,我鼓勵您閱讀Wikipedia Article。簡而言之,有經驗的用戶可以編寫由您的數據庫執行的SQL腳本,並且如果您將用戶的customerId作爲字符串執行,可能會產生有害的結果。我在數據庫編程方面沒有經驗,這只是「常識」...

0

這是我的方法來解決類似的問題。您可以修改它以符合您的需求。

public static bool ImportRowIfNotExists(DataTable dataTable, DataRow dataRow, string keyColumnName) 
{ 
    string selectStatement = string.Format("{0} = '{1}'", keyColumnName, dataRow[keyColumnName]); 
    DataRow[] rows = dataTable.Select(selectStatement); 
    if (rows.Length == 0) 
    { 
     dataTable.ImportRow(dataRow); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
}