OriginalGriff
Для начала, не делай этого! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.
Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.
Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
А на сайте? Значит, кто-то, находящийся в нескольких тысячах миль отсюда, может контролировать вас, БД? Не очень умный ход, совсем нет ... вам нужно исправить это с помощью вашего приложения would, как вопрос Реального приоритета.
И тогда возникает ваше непонимание того, как делать параметризованные запросы, что лежит в основе проблемы, которую вы
иметь замеченный.
cmd.Parameters.AddWithValue("group_members", txtgrpmem.Text);
group_members
это не допустимое имя параметра, это переменные, которые в SQL начинаются с знака atsign.
string strq = "select count(*) from groupmembers where group_members=@GM;
cmd = new OracleCommand(strq, Dbconn);
cmd.Parameters.AddWithValue("@GM", txtgrpmem.Text);
Однако здесь есть и другие проблемы - например, использование одного объекта SqlConnection, который, вероятно, даст вам гораздо больше проблем позже.
Создать подключение внутри
using
блокируйте, используйте его, и он будет автоматически закрыт и утилизирован, когда выйдет из области действия:
using (SqlConnection con = new SqlConnection(strConnect))
{
con.Open();
using (SqlCommand cmd = new SqlCommand("INSERT INTO myTable (myColumn1, myColumn2) VALUES (@C1, @C2)", con))
{
cmd.Parameters.AddWithValue("@C1", myValueForColumn1);
cmd.Parameters.AddWithValue("@C2", myValueForColumn2);
cmd.ExecuteNonQuery();
}
}
Измените весь свой код, чтобы использовать эту модель, пока вы исправляете проблему конкатенации, и это избавит вас от многих царапин в голове позже.