2013-02-07 57 views
2

需要您在下面的幫助。在C中字符串中轉義特殊字符#

我有代碼,我檢查數據表中是否存在特定的行;如果行不存在,那麼我將該行添加到數據表中。這是工作正常,但行失敗時,包含特殊字符鏈接'(單引號)失敗。

下面是代碼:當姓氏包含單引號

string lastName = dgRow.Cells[2].Text.Replace("amp;", ""); 
DataRow[] dr = dt.Select("LastName='" + lastName + "'"); //check whether row is available in datatable or not 

if (dr.Length <= 0)// Condition to check if row is there in data table 
{ 
    dt.Rows.Add(); 
    dt.Rows[dt.Rows.Count - 1]["FirstName"] = dgRow.Cells[1].Text; 
    dt.Rows[dt.Rows.Count - 1]["LastName"] = dgRow.Cells[2].Text; 
    dt.AcceptChanges(); 
} 
return dt; //Return modified data table to calling function. 

此代碼失敗。

我需要一個解決方案,我不會從姓氏中刪除引號。

感謝

+0

此代碼正在Web窗體上運行? –

+0

是的,它的網頁形式 – user1717270

+0

你的意思是這個代碼dgRow.Cells [2] .Text包含引號? –

回答

0

嘗試改變:

DataRow[] dr = dt.Select("LastName='" + dgRow.Cells[2].Text.Replace 
("amp;", "")+ "'"); 

這樣:

DataRow[] dr = dt.Select("LastName='" + dgRow.Cells[2].Text.Replace 
("amp;", "").Replace("\'", "\'\'") + "'"); 

(未經測試)

+0

[以正確的方式轉義DataTable篩選器表達式中的字符]更好的實現(如@Rawling所述)(http://stackoverflow.com/問題/ 386122/correct-way-to-escape-characters-in-a-datatable-filter-expression) –

+0

謝謝,這是工作,但它在newRow [「LastName」] = dgRow.Cells [2] .Text失敗;也在我的數據表中,只有單引號應該去 – user1717270

5

而是首先使用dt.Select()的,我會強烈建議使用LINQ。它避免了整個「在字符串中嵌入查詢」問題,這個問題非常可怕,讓人聯想到SQL注入攻擊。

所以:

var lastNameToFind = dgRow.Cells[2].Text.Replace("&amp;", ""); 
var matched = dt.AsEnumerable() 
       .Where(dr => dr["LastName"].Equals(lastNameToFind)) 
       .Any(); 

if (matched) 
{ 
    DataRow newRow = dt.NewRow(); 
    dt.Rows.Add(newRow); 
    newRow["FirstName"] = dgRow.Cells[1].Text; 
    newRow["LastName"] = dgRow.Cells[2].Text; 
    dt.AcceptChanges(); 
} 
+0

我不想把這個建議作爲編輯,以防萬一我誤解了。我在上面實現了你的代碼,但得到了一個'dr'未定義的錯誤。經過一些閱讀以提高我對LINQ的理解(所以感謝提供這樣的提示!)我將它改爲.Where(dr => dr [「LastName」]。Equals(lastNameToFind))並解決了這個問題。感謝您的解決方案。 – Kate

+0

@Simon:是的,編輯感謝。 –