Member 14042406 Ответов: 1

Это дает мне синтаксическую ошибку пожалуйста помогите мне я не знаю в чем проблема


это дает мне синтаксическую ошибку пожалуйста помогите мне я не знаю в чем проблема
con.Open();
            OleDbCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "update product set LastName=@LastName,FirstName=@FirstName,MiddleName=@MiddleName,Section=@Section where StudentID=@StudentID";
            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("@LastName", TextBox1.Text);
            cmd.Parameters.AddWithValue("@FirstName", TextBox2.Text);
            cmd.Parameters.AddWithValue("@MiddleName", TextBox3.Text);
            cmd.Parameters.AddWithValue("@Section", TextBox4.Text);
          //  cmd.Parameters.AddWithValue("@StudentID", TextBox5.Text);
            cmd.ExecuteNonQuery();


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

я не знаю в чем проблема

con.Open();
            OleDbCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "UPDATE product SET LastName='" + TextBox1.Text+ "',FirstName='" + TextBox2.Text + "',MiddleName='" + TextBox3.Text + "',Section='"+TextBox4.Text+"' where StudentID=" + TextBox5.Text + "";
            cmd.ExecuteNonQuery();
            this.Refresh();

            con.Close();
это мой первый код

1 Ответов

Рейтинг:
1

OriginalGriff

Хорошо, что вы избавились от сцепленной текстовой версии - это очень опасно!

Следующее, что нужно сделать, это выяснить, когда вы получаете "синтаксическую ошибку" - и я предполагаю, что это происходит во время выполнения, а не во время компиляции, что означает, что это проблема с командой SQL.
И это означает, что это, скорее всего, будут именованные параметры, которые OleDbConnection не поддерживает так же, как SqlConnection.
Потому что вы называете параметр в своем запросе, но комментируете его в своем запросе. cmd.Parameters.AddwithValue список, командный процессор tejh, вероятно, жалуется на то, что "<pre>where StudentID=@StudentID</pre>- потому что ... @StudentID будет заменен нулем, и это, вероятно, проблема

Раскомментируйте строку, и она должна работать:

cmd.CommandText = "update product set LastName=@LastName,FirstName=@FirstName,MiddleName=@MiddleName,Section=@Section where StudentID=@StudentID";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@LastName", TextBox1.Text);
cmd.Parameters.AddWithValue("@FirstName", TextBox2.Text);
cmd.Parameters.AddWithValue("@MiddleName", TextBox3.Text);
cmd.Parameters.AddWithValue("@Section", TextBox4.Text);
cmd.Parameters.AddWithValue("@StudentID", TextBox5.Text);
cmd.ExecuteNonQuery();
Но помните, что имена не имеют значения в OldDb и могут быть заменены заполнителями - порядок, в котором они добавляются, управляет тем, куда они идут!
cmd.CommandText = "UPDATE product SET LastName=@LastName, FirstName=?, MiddleName=?, Section=? WHEREStudentID=?";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@LastName", TextBox1.Text);
cmd.Parameters.AddWithValue("@FirstName", TextBox2.Text);
cmd.Parameters.AddWithValue("@MiddleName", TextBox3.Text);
cmd.Parameters.AddWithValue("@Section", TextBox4.Text);
cmd.Parameters.AddWithValue("@StudentID", TextBox5.Text);
cmd.ExecuteNonQuery();


Member 14042406

я раскомментирую строку, но она все еще дает мне синтаксическую ошибку

OriginalGriff

Поэтому покажите нам точно код, который вы используете, и полный текст ошибки.

Member 14042406

кон.Открыть();
OleDbCommand cmd = con.CreateCommand();
УМК.Свойство Commandtype = Значение Commandtype.Текст;
УМК.Свойства commandtext = "обновление продукта набор фамилия=@фамилия, имя=@firstName и middlename=@отчество, раздел,=@раздел, где StudentID="+TextBox5.Текст+"";
cmd.параметры.Четкий();
cmd.параметры.AddWithValue("@LastName", TextBox1.Text);
cmd.параметры.AddWithValue ("@FirstName", TextBox2.Text);
cmd.параметры.AddWithValue("@MiddleName", TextBox3.Text);
cmd.параметры.AddWithValue ("@Section", TextBox4.Text);

УМК.Метод executenonquery();
я удаляю параметры StudentID и заменяю where StudentID=@StudentID на StudentID="+Textbox5.Text+"

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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?