【问题标题】:Delete row from database using OleDb使用 OleDb 从数据库中删除行
【发布时间】:2013-03-27 15:50:35
【问题描述】:

我的这个功能工作了一半。工作正常的部分是我可以在 DataGridView 上选择一行,使用“删除行”按钮调用此函数,然后它将从 DataGridView 中删除该行....但是,它不会删除该行数据库上。

谁能帮助我使用 OleDb 从数据库中删除行?

Function DeleteTableRow()
    Dim TaxConnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ConfigurationManager.AppSettings("Database")
    Dim dbConnection = New OleDbConnection(TaxConnStr)

    Try
        Dim dbCommand As OleDbCommand = New OleDbCommand
        Dim rdr2 As OleDbDataReader

        Dim selectedRow = DataGridView1.SelectedRows

        dbCommand.CommandText = "DELETE FROM UserCriteria WHERE RowID =" & selectedRow
        If dbConnection.State = ConnectionState.Closed Then
            dbConnection.Open()
        End If

        dbCommand.Connection = dbConnection
        rdr2 = dbCommand.ExecuteReader
        dbCommand.ExecuteNonQuery()


        rdr2.Close()

        '''Must select entire row to delete
        'DataGridView1.Rows.Remove(DataGridView1.Rows(DataGridView1.SelectedCells.Item(0).RowIndex))

        '''allows you to select on cell in the row to delete entire row
        For Each oneCell As DataGridViewCell In DataGridView1.SelectedCells
            If oneCell.Selected Then
                DataGridView1.Rows.RemoveAt(oneCell.RowIndex)
            End If
        Next



    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        dbConnection.Close()
    End Try
End Function

【问题讨论】:

    标签: vb.net row oledb


    【解决方案1】:

    DataGridView.SelectedRowsDataGridViewRow 的集合,不能使用集合作为参数来删除数据库表中特定的特定记录。 (你有OPTION STRICT set tot OFF吗?)

    您需要遍历集合,从每一行获取正确的 ID 值,并将该值用作删除查询的参数。

    If dbConnection.State = ConnectionState.Closed Then
        dbConnection.Open()
    End If
    
    ' Creating the command and its parameter here before entering the loop to avoid a continue'
    ' create and destroy pattern for the OleDbCommand'
    Dim dbCommand As OleDbCommand = New OleDbCommand
    dbCommand.CommandText = "DELETE FROM UserCriteria WHERE ID =?"
    dbCommand.Connection = dbConnection
    dbCommand.Parameters.AddWithValue("@row", 0) 
    Dim rows = DataGridView1.SelectedRows
    For Each row in rows
        dbCommand.Parameters("@row").Value = row.Cells("ID").Value)
        dbCommand.Connection = dbConnection
        dbCommand.ExecuteNonQuery()
    Next
    

    还要注意不要使用字符串连接来构建sql命令。这种习惯导致了一种叫做 Sql Injection 的蠕虫病毒

    当然,这里不需要 OleDbDataReader。 (没什么可读的)

    【讨论】:

    • 更正---数据库中的列名只是“ID”。此外,在 DataGridView 上,我将此列(“ID”列)设置为隐藏。这是个问题吗?
    • 不只是更改代码以反映这一事实。我会更新答案
    • 您的 For 循环似乎不正确。我有“对于 Datagridview1.selectedrows 中的每个 selectedRow”...
    • 是的,对,从 C# 复制、粘贴和翻译太快了。固定
    • 仍然收到一条错误消息,提示“找不到名为 ID 的列。”...但我正盯着数据库。我在 UserCriteria 表中看到一个名为“ID”的列。 ..
    【解决方案2】:

    您不需要阅读器来删除一行。不会返回任何数据

       rdr2 = dbCommand.ExecuteReader
        dbCommand.ExecuteNonQuery()
    
    
        rdr2.Close()
    

    应该是

        dbCommand.ExecuteNonQuery()
    

    【讨论】:

      【解决方案3】:

      问题是您的DataGridView1.SelectedRows 将返回SelectedRowCollection(抱歉,我假设这是一个WinForms 应用程序)。当传递给您的 CommandText 时,这不会得到正确的结果,因为您可能会得到 SelectedRowCollection 的 ToString() 而不是您所追求的 ID

      您真正想要做的是遍历集合(如果用户能够选择多行)并删除选择的每一行,例如:

      For Each selectedRow in DataGridView1.SelectedRows
          '1. Get the DatabaseId of the selected row
          '2. Modify dbCommand.CommandText to use the selected row from 1
          '3. execute command like you are doing with ExecuteNonQuery
      Next
      

      上面的每个selectedRow 都属于this 类型...它有一个Cells 属性,您可以访问以获取您需要的ID(我不确定它将在哪个单元格中,但您应该能够从您的代码中分辨出来)。

      【讨论】:

        猜你喜欢
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 2015-08-07
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        相关资源
        最近更新 更多