2013-02-07 19 views
2

Besoin de votre aide ci-dessous.Echapper à un caractère spécial dans la chaîne en C#

J'ai le code où je vérifie qu'une ligne particulière existe dans datatable ou non; si la ligne n'existe pas, j'ajoute cette ligne à datatable. Cela fonctionne très bien, mais échoue lorsque la valeur de la ligne contient un lien char spécial ' (guillemet simple).

Voici le code:

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. 

Ce code échoue lorsque LastName contient des guillemets simples.

J'ai besoin d'une solution où je ne supprime pas les citations du nom de famille.

Merci

+0

ce code est en cours d'exécution sur le formulaire Web? –

+0

Oui c'est sur un formulaire Web – user1717270

+0

que vous voulez dire ce code dgRow.Cells [2] .Text contient des guillemets? –

Répondre

0

Essayez de changer:

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

à ceci:

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

(non testé)

+0

Meilleure implémentation (comme mentionné par @Rawling) dans [Manière correcte d'échapper les caractères dans une expression de filtre DataTable] (http://stackoverflow.com/ questions/386122/correct-way-to-escape-caractères-in-a-datatable-filtre-expression) –

+0

Merci, cela fonctionne cependant son échec dans newRow ["LastName"] = dgRow.Cells [2] .Text; aussi dans mon datatable seule citation unique devrait aller – user1717270

5

Au lieu d'utiliser dt.Select() en premier lieu, je suggère fortement d'utiliser LINQ. Il évite l'ensemble du problème "d'inclusion de requêtes dans les chaînes" qui est si effrayant et qui rappelle les attaques par injection SQL.

Alors:

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

Je ne voulais pas suggérer cela comme une modification au cas où je viens d'avoir mal compris. J'ai implémenté votre code ci-dessus mais j'ai reçu une erreur qui n'était pas définie. Après quelques lectures pour améliorer ma compréhension de LINQ (donc merci de fournir une invite à le faire!) Je l'ai changé en .Where (dr => dr ["LastName"]. Equals (lastNameToFind)) et cela l'a résolu. Merci pour la solution. – Kate

+0

@Simon: Yup, édité merci. –

Questions connexes