2014-10-11 3 views
1

Здесь у меня есть этот метод в моем файле CandidateOp.Escape single quote in sql query C#

public SqlDataReader getpartyID(string partyName) 
{ 
    string query = "EXEC partyIDtoInsert'" +partyName+ "'"; 
    return new DataAccessLayer().executeQuerys(query); 
} 

Я пропускание ComboBox текста в форме и я получаю ID к целому типу переменной tempPrID.

SqlDataReader reader02 = new CandidateOP().getpartyID(cmbParty.Text); 
if (reader02.HasRows) 
{ 
    while (reader02.Read()) 
    { 
     tempPrID = (Int32)reader02[0]; 
    } 
    reader02.Close(); 
} 
else 
{ 
    MessageBox.Show("Please enter a valid Party Name", "Invalid DATA"); 
} 

partyIDtoInsert, хранимая процедура я создал и она вызывается в методе getpartyID, как показано выше, чтобы получить идентификатор единой национальной партии.

EXEC partyIDtoInsert 'United National Party'; 

Если у меня есть имя партии под названием «Объединенная народная свобода Альянс», так что если я хочу вставить это имя, моя хранимая процедура выполнения коды выглядит следующим образом.

EXEC partyIDtoInsert 'United People's Freedom Alliance'; 

В этом случае он рассматривает конечную точку как единую котировку People и возвращает меня с исключением sql.

Как избежать этой проблемы с одиночной кавычкой в ​​инструкции для выполнения моей хранимой процедуры.

ответ

5

Просто замените одиночную кавычку (') двойной одинарной цитатой, например' '.

так что ваша функция будет выглядеть следующим образом:

public SqlDataReader getpartyID(string partyName) 
      { 
       string query = "EXEC partyIDtoInsert'" +partyName.Replace("'", "''") + "'"; 
       return new DataAccessLayer().executeQuerys(query); 
      } 

Я надеюсь, что это решит вашу проблему. :)

+0

it работает. Огромное спасибо .. – chathwind

+1

Проголосовал за то, что проголосовать не было объяснено. Несмотря на то, что этот метод открыт для SQL-инъекции, он не должен быть проголосован. – Measuring

0

попробовать EXEC partyIDtoInsert 'United People''s Freedom Alliance';

4

Во-первых, вы должны использовать SqlParameters, чтобы избежать SQL Injection

string query = "EXEC partyIDtoInsert @PartyName"; 

Где вы exectuing запрос

SqlCommand cmd = new SqlCommand(query, connection); 
cmd.Parameters.AddWithValue("@PartyName", partyName); 

В противном случае проблема заключается в том, что у вас нет " «между partyIDtoInsert и« Объединенным народным союзом свободы ». Если вы хотите продолжить использовать "EXEC partyIDtoInsert '", скажите мне, как это. Но это неправильно! Читайте о sql Injection!

+0

, как применять его в этом method.public SqlDataReader getpartyID (строка partyName) { строка запроса = "EXEC partyIDtoInsert '+ partyName + "'"; возвращает новый DataAccessLayer().executeQuerys (запрос); } – chathwind

+0

Как это сделать в этом методе. Я вызываю соединение в отдельном классе, как это. Безопасность не имеет большого значения, поскольку это касается моего личного использования. Так что, пожалуйста, не делайте SQL-инъекции здесь. Но я хочу знать, как применить его в этом методе. public SqlDataReader getpartyID (string partyName) { string query = "EXEC partyIDtoInsert" + partyName + "'"; возвращает новый DataAccessLayer(). ExecuteQuerys (query); } – chathwind

+0

Безопасность не является единственной причиной для параметров запроса. Они также ускоряют производство и спасают специальные персонажи, такие как апострофы. –

1

Как Hitesh Mistry предоставил такой ответ, это сработало для меня.

  public SqlDataReader getpartyID(string partyName) 
     { 
      string query = "EXEC partyIDtoInsert'" +partyName.Replace("'", "''") + "'"; 
      return new DataAccessLayer().executeQuerys(query); 
     } 

Я хочу, чтобы кто-то объяснил, как использовать параметры sql. потому что я хотел бы, чтобы это было реализовано таким образом. Я не получаю ответ с параметрами sql, поскольку он имеет дело с соединением. Я использую соединение в отдельном классе под названием DBconnect следующим образом. Он вызывается из другого класса DataAccessLayer.

Вот как я использую соединение в DBConnect.

 public static string makeConnection() 
    { 
     string con = ConfigurationManager.ConnectionStrings["MyDb.Properties.Settings.ConString"].ToString(); 
     return con; 
    } 
Смежные вопросы