Babai JermenKeller Sasmal Ответов: 4

Как удалить записи с тем же именем, но другим идентификатором ?


Ну, у меня тут возникла ситуация, и я немного запутался в этой проблеме. Я знаю, как удалить строку из базы данных с помощью VB, но ситуация-это реальный сценарий.

допустим, в моей программе зарегистрированы два человека с одинаковым именем. Но другой идентификатор. И они совершенно разные люди.

Если я удалю по имени, то программа удалит их обоих. Если я хочу удалить по ID, то combobox, который я использовал для удаления, который дает вывод в виде имени вместо ID, приводит меня в замешательство.

Что же делать ?

Я добавил код, Пожалуйста, помогите избавиться от этой ситуации.

Любые идеи будут оценены по достоинству.

Подумайте о моем плохом английском.

Ты codeproject.

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

Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click
        connection = New SqlConnection("SERVER=192.168.80.120,1433;USER ID=sa;PASSWORD=123456;DATABASE=gogreendb")
        Dim reader As SqlDataReader
        Try
            connection.Open()
            Dim query As String
            query = "DELETE from faculty WHERE name='" & ComboBox1.Text & "'"
            command = New SqlCommand(query, connection)
            reader = command.ExecuteReader
            MsgBox("Faculty no longer available")
            connection.Close()
            fac_dgv()
            fac_list()
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            connection.Dispose()
        End Try
    End Sub

#realJSOP

WPF или WinForms? (WinForms-это гораздо больше хлопот).

Richard Deeming

В дополнение к уязвимости SQL-инъекции вы подключаетесь к базе данных следующим образом: sa- Не делай этого!

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

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

Babai JermenKeller Sasmal

Ричард Im использует localdatabase с логином Windows по умолчанию. Я использовал их, чтобы объяснить свою строку подключения. На самом деле я использую модуль подключения со строкой.

Источник данных=(localdb)\v11.0;AttachDbFileName=G:\MyDatabase.mdf;Integrated Security=True

Тай за ответ, пожалуйста, реши мою проблему.

Maciej Los

Есть ли только идентификатор и имя конкретного человека? Представьте себе, есть тысячи Адамов. Как пользователь будет знать, какой Адам удалить, даже если он получит идентификатор каждого Адама?

Babai JermenKeller Sasmal

Мацей Лос, есть несколько доступных полей. Например, идентификатор значка, имя пользователя, уровень.
Допустим, там есть два Адама Уотсона

BadgeID: 1
Имя: Адам Уотсон
Имя Пользователя: AdamWatSon1
Уровень: 1 (факультет, где уровень разрешения факультета равен 1)

BadgeID: 2
Имя: Адам Уотсон
Имя Пользователя: AdamWatSon2
Уровень: 1 (факультет, где уровень разрешения факультета равен 1)

Если я хочу удалить этот факультет по имени, то моя программа удалит Адама Уотсона (ID: 1 и 2 Оба)

Надеюсь, я заставлю вас понять, в чем дело.

Я хочу удалить Адама Уотсона с идентификатором значка 2

Maciej Los

Кажется, ты меня не понимаешь. Вы можете забрать всех Адамов и вернуть их имена и badgeid. Тогда Вы сможете удалить того Адама, которого выберете сами.

Babai JermenKeller Sasmal

Ох. теперь я понимаю.

4 Ответов

Рейтинг:
36

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

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

Во-вторых, вам нужно использовать идентификатор, а не имя, или и то, и другое.
Например, чтобы избавиться от всех пользователей, кроме одного:
DELETE FROM Faculty WHERE name = 'John Smith' AND ID != 12345


Babai JermenKeller Sasmal

Я попробую это сделать. Тай, за то, что помогаешь OriginalGriff, ты, как всегда, потрясающая.

OriginalGriff

Всегда пожалуйста!

Рейтинг:
25

Maciej Los

Прежде всего, SQL Server поддерживает хранимые процедуры, которые могут использоваться для вставки, обновления и удаления данных.

Так...
1. Создание хранимой процедуры[^] который получает имя человека и возвращает все совпадающие лица[^] с их помощью badgeid Для получения более подробной информации, пожалуйста, смотрите: Как выполнить хранимую процедуру, возвращающую строки[^]
2. Создайте хранимую процедуру, которая получит badgeid и возвращает количество удаленных записей. Видеть: Изменение данных с помощью хранимых процедур | Microsoft Docs[^]
Использование хранимой процедуры с выходными параметрами | Microsoft Docs[^]

Вот и все!


Рейтинг:
2

Member 13108469

Прежде всего, на мой взгляд... Вы не используете reader для таких команд DML. Это только для команд DQL.

connection = New SqlConnection("SERVER=192.168.80.120,1433;USER ID=sa;PASSWORD=123456;DATABASE=gogreendb")

Try
    connection.Open()
    query = "DELETE from faculty WHERE name='" & ComboBox1.Text & "'"
    command = New SqlCommand(query, connection)
    command.ExecuteNonQuery
    connection.Close()
    fac_dgv()
    fac_list()
Catch ex As Exception
    MsgBox(ex.Message)
Finally
    connection.Dispose()
End Try



Что касается части удаления. Вы можете объединить идентификатор и имя в раскрывающемся списке. Вы можете отобразить, если хотите, "Лебром Джеймс (1)". "1" - это идентификатор...

И сделайте форматирование строки во время процесса удаления.


Рейтинг:
0

Member 11881188

Прежде всего, то, что сказал Грифф, абсолютно правильно, вы никогда не должны использовать эти команды SQL типа, которые открыты для SQL-инъекций.
Что у вас есть привязанное к полю со списком как ценность подано? В идеале вы должны привязать поле значения поля со списком следующим образом Айди и текст поле как имя. При удалении записи вместо использования текста вы можете использовать значение, как показано ниже.

query = "DELETE from faculty WHERE name='" & ComboBox1.Value <pre lang="c#"> & "'"