Darsh12345 Ответов: 1

Ошибка - недопустимое имя/ номер переменной


ошибка при
int records = (int)cmd.Executescalar так();

недопустимое имя переменной/ номер

Что я уже пробовал:

protected void addmem_Click(object sender, EventArgs e)
        {
            
                string strq = "select count(*) from groupmembers where group_members='" + txtgrpmem.Text + "'";
                cmd = new OracleCommand(strq, Dbconn);
                cmd.Parameters.AddWithValue("group_members", txtgrpmem.Text);
                if (Dbconn.State == ConnectionState.Closed)
                {
                    Dbconn.Open();
                }

                int records = (int)cmd.ExecuteScalar();
                if (records == 0)
                {
                    string str = "insert into groupmembers values('" + grpddl.SelectedValue.ToString() + "', '" + txtgrpmem.Text + "')";
                    cmd = new OracleCommand(str, Dbconn);
                    if (Dbconn.State == ConnectionState.Closed)
                    {
                        Dbconn.Open();
                    }
                    cmd.ExecuteNonQuery();
                    txtgrpmem.Text = "";
                    FillGrid();
                    lbladdmem.Text = "Member added successfully.";
                    lbladdmem.ForeColor = System.Drawing.Color.Green;
                    lblmsg.Text = ""; 
                    
                }
                else
                {
                    
                    lblexist.Text = "Member already exist";
                    lblexist.ForeColor = System.Drawing.Color.Green;
                }
            
            
        }

1 Ответов

Рейтинг:
0

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();
        }
    }
Измените весь свой код, чтобы использовать эту модель, пока вы исправляете проблему конкатенации, и это избавит вас от многих царапин в голове позже.


Richard Deeming

ОП использует Oracle, поэтому имена параметров должны начинаться с : вместо @. :)