2010-12-08 13 views
0

i face au problème suivant ::remplacer le mécanisme de la méthode

je veux échapper au caractère suivant 'guillemet simple:

cela fonctionne lors de ce test par: intégré dans la méthode Replace("'","''");

comme ce code ci-dessous: (juste un test), il fonctionne

protected void btn_insert_Click(object sender, EventArgs e) 
{ 
      lbl.Text = string.Empty; 
      SqlConnection mycon = new SqlConnection(Constr);` 

      SqlCommand mycommand = new SqlCommand("INSERT INTO details VALUES('" + txt.Text.Replace("'", "''") + "','" + txt.Text.Replace("'", "''")+ "')", mycon); 

      mycon.Open(); 
      int affectedRows = 0; 

      affectedRows = mycommand.ExecuteNonQuery(); 
      mycon.Close(); 
     } 

mais je veux généraliser ma solution pour travailler partout dans l'application à travers mon Inse méthode rt dans la couche d'accès aux données:

public static int InsertEntity(string tblName, Dictionary<string, string> dtParams) 
     { 
      int Result = -1; 
      DBConnection DAL_Helper = new DBConnection(""); 
      string[] field_names = new string[dtParams.Count]; 
      dtParams.Keys.CopyTo(field_names, 0); 
      string[] field_values = new string[dtParams.Count]; 
      dtParams.Values.CopyTo(field_values, 0); 
      for (int i = 0; i < field_values.Length; i++) 
      { 
       field_values[i].Replace("'", "''"); 
      } 
      string insertCmd = "INSERT INTO " + tblName + " (" + string.Join(",", field_names) + ") values ('" + string.Join("','", field_values) + "')"; 

      Result = DAL_Helper.Execute_NonQuery(insertCmd); 
      return Result; 
     } 

cela n'échapper à la 'charecter guillemet simple, bien que j'utilise Replace("'","''");

quel est le problème ,, comment résoudre ce problème?

+1

Remarque: Si vous utilisez il n'y aura pas une procédure ou Entity Framework stockée est un problème d'injection sql. La citation n'est pas le seul caractère, il peut y en avoir d'autres comme '[', '%' etc – dhinesh

Répondre

5

Je vous recommande fortement d'utiliser Command Parameters en utilisant la collection SqlCommand.Parameters au lieu de votre approche.

Le problème est ici:

 for (int i = 0; i < field_values.Length; i++) 
     { 
      field_values[i].Replace("'", "''"); 
     } 

Remplacez-le par:

 for (int i = 0; i < field_values.Length; i++) 
     { 
      field_values[i] = field_values[i].Replace("'", "''"); 
     } 
+1

Oui, j'ai lu ça. Dans votre deuxième code, changez le code de boucle comme mentionné ci-dessus. 'String.Replace()' La méthode ne change pas la chaîne sur laquelle elle est appelée mais renvoie la chaîne modifiée. – decyclone

+0

super, merci beaucoup, est-ce lié à l'immutabilité de la chaîne, ou non .. –

+1

Oui, vous avez raison. il est lié à l'immutabilité des cordes. – decyclone

3

Miser sur la réponse de decyclone. CommandParameters est le chemin à parcourir ici, vous ne faites que le réinventer avec votre propre code.

J'ai trouvé un très bon exemple clair ici pour fournir des paramètres à une instruction SQL.

http://dotnetperls.com/sqlparameter

 using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection)) 
     { 
      string dogName = "Mc'Dougal"; 
      // 
      // Add new SqlParameter to the command. 
      // 
      command.Parameters.Add(new SqlParameter("Name", dogName)); 
      // 
      // Read in the SELECT results. 
      // 
      SqlDataReader reader = command.ExecuteReader(); 
     } 
Questions connexes