1

私はこの機能を半分正しく動作させています。正しく機能している部分は、DataGridView で行を選択し、「行の削除」ボタンを使用してこの関数を呼び出すと、DataGridView から行が削除されます....ただし、行は削除されませんデータベース上。

OleDb を使用して DB から行を削除するのを手伝ってくれる人はいますか?

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
4

3 に答える 3

2

DataGridView.SelectedRowsは のコレクションですDataGridViewRow。コレクションをパラメーターとして使用して、データベース テーブルの特定の特定のレコードを削除することはできません。( OPTION STRICT を 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 インジェクションと呼ばれるワームの缶全体につながります。

もちろん、ここでは OleDbDataReader は必要ありません。(何も読む必要はありません)

于 2013-03-27T16:19:57.510 に答える
1

行を削除するのにリーダーは必要ありません。データは返されません

   rdr2 = dbCommand.ExecuteReader
    dbCommand.ExecuteNonQuery()


    rdr2.Close()

単純にする必要があります

    dbCommand.ExecuteNonQuery()
于 2013-03-27T16:16:42.010 に答える
0

問題は、 (申し訳ありませんが、これは WinForms アプリであると想定しています)DataGridView1.SelectedRowsを返すことです。SelectedRowCollectionそして、それがあなたに渡されたときに正しい結果が得られるわけではありませCommandTextん。おそらく、あなたが求めてSelectedRowCollectionいるIDではなくのToString()を取得するからです

実際にやりたいことは、コレクションをループして (ユーザーが複数の行を選択できる場合)、選択された各行を次のように削除することです。

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このタイプになります...Cells必要なIDを取得するためにアクセスできるプロパティがあります(どのセルにあるのかわかりませんが、コードからわかるはずです)。

于 2013-03-27T16:21:12.490 に答える