【问题标题】:Delete selected rows in datagridview from database从数据库中删除 datagridview 中的选定行
【发布时间】:2019-01-27 20:11:48
【问题描述】:

我正在尝试使用 SQL Server 删除用户在 datagridview 中选择的行。

我有一个加载数据库内容的datagridview,在本例中为UsernamePassword。 请记住,每个用户名在数据库中都是唯一的,因此我应该能够使用唯一的用户名删除每一行。

我目前拥有的 SQL 是 DELETE FROM 'Users&Passwords' WHERE 'Username' = ? 我不确定这是否完全正确,但是每当我单击 QueryBuilder 时,它似乎都会接受它。

我必须尝试执行此操作的代码如下:

    Private Sub btn_remove_Click(sender As Object, e As EventArgs) Handles btn_remove.Click
        For Each row As DataGridViewRow In DataGridView1.SelectedRows
            Dim usernametodelete As String = DataGridView1.SelectedRows(0).Cells(0).Value.ToString
            'TextBox1.Text += usernametodelete
            Me.Users_PasswordsTableAdapter.DeleteUser(usernametodelete)
            Me.Users_PasswordsTableAdapter.Fill(Me.ManageUsersDataSet._Users_Passwords)
        Next
    End Sub

我希望当用户单击 Remove User(s) 按钮时,从 datagridview 中选择的行会从数据库中删除这些行。任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server vb.net


    【解决方案1】:

    您的参与程度比您需要的要多一些。理想情况下,您应该采取的一系列步骤是:

    0) 重命名您的表格,使其中没有 & 字符 - 它只是自找麻烦

    1) 将表添加到数据集,过程如下:右键单击设计图面,新建 tableadapter,配置连接字符串,将查询设置为SELECT * FROM Users WHERE Username LIKE @username,确保设置了其他内容,例如是否要生成dbdirect 方法,以及是否希望数据集刷新新值

    2) 在您的数据源窗口中(默认情况下可能不显示,在 Visual Studio 的菜单中找到它)将用户节点从数据源窗口拖放到表单上。这将创建一个绑定到类型化数据表的 datagridview,并创建一个数据集、tableadapter、tableadaptermanager(不是严格需要;可以删除)、一个 bindingnavigator 工具条(同样不是严格需要,但上面有一个方便的预接线保存按钮)和一个绑定源。它还会将一些代码预填充到 form_load 事件处理程序中以填充数据表

    3) 就是这样 - 您的表单有一个网格,绑定到一个数据表。该网格能够删除行 - 单击行标题并按键盘上的删除按钮,行消失。单击工具条中的保存图标,更改将持久保存到数据库中。您唯一需要做的就是首先将数据放入表中。我提供了一个 SQL,允许您选择一些要加载的用户名,但您可以通过将 Form_Load 中的代码行更改为:

    yourTableAdapterName.Fill(yourDatasetname.YourDatatableName, "%")
    

    在名称中传递百分比就像 DOS 中的 * 通配符。 LIKE % 将选择所有记录。当然,您也可以保留默认设置(它将引用工具条上的文本框),而是运行程序,在工具条上的文本框中输入 % 并单击“填充”。或者您可以将 JOHNSMITH 或 JOHN% 放入文本框中并填充,以分别加载该用户/那些用户

    希望你已经完成了 1 和 2..

    关于所有这些东西如何运作的背景故事:

    DataTables 是数据库中表的客户端表示。它们并不打算包含数据库中的所有数据,仅包含您想要使用的一部分数据。当您从数据库中加载一行时,您可以对其进行编辑、删除(标记为已删除),当您调用tableAdapter.Update(yourtable) 时,您所做的更改将保留到数据库中。请注意,即使它被称为Update,该方法也会保存新行(通过执行 INSERT)、删除行(SQL DELETE)并进行更新(SQL UPDATE)。如果您的数据表有 4 行从数据库中加载,然后您添加 2 行新行,对已加载的 3 行进行更改并删除第 4 行,则调用 tableadapter.Update 会将所有这些更改保存到数据库中。您无需选择数据表,相应地调用 tableadapter.insert/update/delete 来手动保留这些更改。使用 tableadapter 的流程如下:

    tableAdapter.Fill(datatable, maybe,parameters,to,control,the,fill,here)  
    
    'work with the datatable here, change, insert, delete. Use loops/code, use the UI, etc
    
    tableAdapter.Update(datatable) 'save changes
    

    【讨论】:

      【解决方案2】:
       I suggest putting an id column in your datagridview and just hide it so that you can easily delete the record you want to remove easily without conflict, because if you will use a username, what if theres a duplicate username exist.
      
      
      
         Private Sub BTNDELETE_Click(sender As Object, e As EventArgs) Handles BTNDELETE.Click
                      Public result As Integer = 0
                      Public cmd As New MySqlCommand
                      strcon.Open() 'your connection string here
                      With cmd
                          .Connection = strcon 'your connection string
                          .CommandText = "DELETE FROM `users` WHERE `id` = '" & DTGLIST.CurrentRow.Cells(0).Value.ToString() & "';"
                          result = cmd.ExecuteNonQuery
                          If result > 0 Then
                             MsgBox("Successfully Removed.", MsgBoxStyle.Information, "Info")
                             DTGLIST.Rows.Remove(DTGLIST.SelectedRows(0))
                          End If
                      End With
                      strcon.Close() 'close the connection string
              End Sub
      

      【讨论】:

      • 您好,谢谢,但每个用户名都是唯一的,因此不能有重复的用户名。你能看出为什么我的代码不起作用吗?
      【解决方案3】:

      设法弄清楚为什么几天前我的删除查询不起作用。这是由于我的 SQL 不正确。这对我有用DELETE FROM [Users&Passwords] WHERE (Username = ?)

      在我的代码中还有Me.Users_PasswordsTableAdapter.DeleteUser(usernametodelete) 行使其工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 2015-05-04
        • 2016-08-02
        相关资源
        最近更新 更多