2010-12-08 2 views
0

я сталкиваюсь со следующей проблемой ::заменить метод механизм

я хочу, чтобы избежать следующего символа 'одинарная кавычка:

это работает, делая этот тест через: встроенный метод Replace("'","''");

, как этот код ниже: (только тест) он работает

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(); 
     } 

, но я хочу, чтобы обобщить мое решение работать по всему приложению через мой Inse Метод к.т. в слое доступа к данным:

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; 
     } 

это не спасаясь от "одинарной кавычки charecter, хотя я использую Replace("'","''");

что проблема ,, как решить эту проблему?

+1

Примечание: Если вы используете хранимую процедуру или Entity Framework не будет никаких проблем в SQL инъекции. Цитата не единственный персонаж, который может быть другим, например, «[», «%» и т. Д. – dhinesh 2010-12-08 13:13:20

ответ

5

Я настоятельно рекомендую вам использовать Command Parameters, используя SqlCommand.Parameters, вместо вашего подхода.

Проблема здесь:

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

Замените его:

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

Да, я это читал. В вашем втором коде измените код цикла, как указано выше. `String.Replace()` метод не изменяет строку, на которую он вызывается, но возвращает измененную строку. – decyclone 2010-12-08 12:37:25

3

Опираясь на ответ decyclone в. CommandParameters - путь сюда, вы просто заново изобретаете его с помощью своего собственного кода.

Я нашел здесь очень хороший яркий пример для предоставления params инструкции 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(); 
     } 
Смежные вопросы