Здесь у меня есть этот метод в моем файле класса 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.
Как избежать этой проблемы с одиночной цитатой в инструкции для выполнения моей хранимой процедуры.
Просто замените одиночную кавычку (') двойной одинарной цитатой, например' '.
поэтому ваша функция будет выглядеть так:
public SqlDataReader getpartyID(string partyName)
{
string query = "EXEC partyIDtoInsert'" +partyName.Replace("'", "''") + "'";
return new DataAccessLayer().executeQuerys(query);
}
Надеюсь, это решит вашу проблему. :)
Сначала вы должны использовать 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!
Поскольку 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;
}
попробуйте EXEC partyIDtoInsert 'United People' Freedom Alliance';