Member 13864666 Ответов: 3

- Синтаксическая ошибка в предложении from. VB.NET - доступ


Сначала, когда он показал эту ошибку
я ставил [*С] перед От заявление
например: ["удалить student_id *ОТ студент]

И все же это не работает

Может ли кто-нибудь помочь мне в этом

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

Private Sub btndelete_Click_1(sender As Object, e As EventArgs) Handles btndelete.Click
        cmdDelete.CommandText = "Delete [student_id] FROM student as S1 join payment as S2 on S1.student_id=S2.student_id where S1.student_id=(" + txtsid.Text + ");"
        cmdDelete.CommandType = CommandType.Text
        cmdDelete.Connection = cnnOLEDB
        cmdDelete.ExecuteNonQuery()
        MessageBox.Show("Are You Sure You Want To Delete?", "Deletion", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        If DialogResult.Yes Then
            UserHomepage.Show()
            Me.Hide()
        ElseIf DialogResult.No Then
            Me.Show()
            UserHomepage.Hide()
            lblname.Hide()
            txtsid.ResetText()
        End If
    End Sub

MadMyche

Пожалуйста, объясните, почему на таблицу платежей (S2) ссылаются; это поможет устранить ваши проблемы с кодированием

3 Ответов

Рейтинг:
7

Maciej Los

Насколько я знаю, MS Access не поддерживает DELETE + JOIN. Вы должны изменить свою команду sql на нижеприведенную форму:

DELETE Table1.*
FROM Table1
WHERE EXISTS( Select 1 From Table2 Where Table2.Name = Table1.Name )


Но, когда я снова посмотрел на вас вопросительно, я думаю, что вам нужно только:
DELETE
FROM student
WHERE student_id=?;


MadMyche

Почему вы не используете именованные параметры?

Рейтинг:
12

phil.o

Никогда, никогда не создавайте SQL-запрос так, как вы это делаете, объединяя строки, полученные из пользовательских входных данных. Это оставляет ваш код широко открытым для атак SQL-инъекций. Вместо этого лучше использовать параметризованные запросы. Эта тема ежедневно обсуждается здесь, на CP, так что вам не составит труда найти еще какую-то информацию об этом (например, поиск sql-инъекции в qa).

Кроме того, что касается вашего SQL-запроса, то для удаления строки в таблице вам не нужно указывать имя столбца. DELETE утверждение не является SELECT заявление.
Кроме того, чтобы удалить строку в таблице S1, Вам также не нужно присоединяться к S2.
Таким образом, все это будет прибегать к блоку кода, который будет выглядеть следующим образом:

cmdDelete.CommandText = "Delete FROM student where student_id=@id;"
cmdDelete.Paramaters.AddWithValue("@id", txtsid.Text)
...

Если student_id столбец имеет целочисленный тип, возможно, вам придется написать:
cmdDelete.CommandText = "Delete FROM student where student_id=@id;"
Dim id as Integer
If (integer.TryParse(txtsid.Text, out id) Then
   cmdDelete.Paramaters.AddWithValue("@id", id)
Else
   '' Error: provided id was not a valid integer representation
End If

вместо.


MadMyche

Поставщик OleDB не поддерживает именованные параметры.

Maciej Los

Компонент MS Access database engine поддерживает именованные параметры. Проверьте, чтобы узнать ;)

MadMyche

Пожалуйста, приведите свой источник для этого; в документации конкретно говорится, что это не так

phil.o

Да, Access имеет специальный синтаксис для параметров запроса. Пожалуйста, взгляните на решение 1 ниже, правильный синтаксис указан (с помощью ? вместо именованного параметра).

Рейтинг:
1

Richard Deeming

Как говорится в ошибке, ваш DELETE синтаксис неверен.

Ваш код также уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

И вы, вероятно, хотите спросить пользователя, хотят ли они удалить запись ДО вы действительно удаляете запись! :)

cmdDelete.CommandText = "Delete student.* FROM student as S1 join payment as S2 on S1.student_id=S2.student_id where S1.student_id = ?"
cmdDelete.Parameters.AddWithValue("sid", txtsid.Text)

РЕДАКТИРОВАТЬ: Как указано в решении 3, Access не поддерживает объединения в DELETE заявление:
Оператор DELETE (Microsoft Access SQL)[^]
cmdDelete.CommandText = "DELETE * FROM student WHERE Exists(SELECT 1 FROM payment WHERE payment.student_id = student.student_id) And student_id = ?"
cmdDelete.Parameters.AddWithValue("sid", txtsid.Text)


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]


Dave Kreskowiak

МММ... "УДАЛИТЬ студент.* От ..."??

Я не так уж много занимаюсь SQL, но разве это не должно быть "удалить из студента ..."?

Я даже не думаю, что join тоже должен быть там.

Richard Deeming

В SQL это было бы так, но ОП спрашивал о MS Access, который является странным зверем. :)

MadMyche

Возможно, он хочет удалить студента только в том случае, если этот студент заплатил....

Member 13864666

В 5-й строке последнее слово - "Сид"
Это имя столбца в моей базе данных?
Если нет, то могу ли я узнать, что это такое?
И зачем это нужно?
Спасибо

Richard Deeming

"sid" - это имя параметра.

Команды OLE DB не поддерживают именованные параметры, поэтому вам просто нужно дать им уникальное имя внутри команды и убедиться, что вы добавляете параметры в той же последовательности, что и символы-заполнители - ? - в тексте команды.

Maciej Los

Поддерживает, поддерживает...
Лучший способ узнать это-проверить.