Избегайте одинарных кавычек в sql запросе c #

1

Здесь у меня есть этот метод в моем файле класса CandidateOp.

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

Я ComboBox текст 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'; 

Если у меня есть название группы под названием "United People Freedom Alliance", поэтому, если мне нравится вставлять это имя, моя исполняемая код хранимой процедуры выглядит так.

EXEC partyIDtoInsert 'United People Freedom Alliance';

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

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

Теги:
sql-server

4 ответа

5
Лучший ответ

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

поэтому ваша функция будет выглядеть так:

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

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

  • 0
    оно работает. Большое спасибо..
  • 1
    Против проголосовало, потому что отрицательное голосование не было объяснено. Несмотря на то, что этот метод открыт для SQL-инъекций, его не нужно подвергать сомнению.
4

Сначала вы должны использовать SqlParameters, чтобы избежать использования sql Injection

string query = "EXEC partyIDtoInsert @PartyName";

Где вы выполняете запрос

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

В противном случае проблема в том, что у вас нет "" между partyIDtoInsert и "United People Freedom Alliance". Если вы хотите продолжить использование "EXEC partyIDtoInsert '" мне это нравится. Но это неправильно! Читайте о sql Injection!

  • 0
    как применить это в этом методе. public SqlDataReader getpartyID (string partyName) {string query = "EXEC partyIDtoInsert '" + partyName + "'"; вернуть новый DataAccessLayer (). executeQuerys (запрос); }
  • 0
    Как это сделать в этом методе. Я вызываю соединение в отдельном классе, как это. Безопасность не имеет большого значения, так как это для моего личного использования. Поэтому, пожалуйста, не делайте инъекцию SQL здесь большим делом. Но я хочу знать, как применить это в этом методе. public SqlDataReader getpartyID (string partyName) {string query = "EXEC partyIDtoInsert '" + partyName + "'"; вернуть новый DataAccessLayer (). executeQuerys (запрос); }
Показать ещё 4 комментария
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;
    }
0

попробуйте EXEC partyIDtoInsert 'United People' Freedom Alliance';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню